mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
GH-103857: Deprecate utcnow and utcfromtimestamp (#103858)
Using `datetime.datetime.utcnow()` and `datetime.datetime.utcfromtimestamp()` will now raise a `DeprecationWarning`. We also have removed our internal uses of these functions and documented the change.
This commit is contained in:
parent
a5308e188b
commit
0b7fd8ffc5
10 changed files with 101 additions and 34 deletions
|
@ -896,6 +896,10 @@ Other constructors, all class methods:
|
||||||
in UTC. As such, the recommended way to create an object representing the
|
in UTC. As such, the recommended way to create an object representing the
|
||||||
current time in UTC is by calling ``datetime.now(timezone.utc)``.
|
current time in UTC is by calling ``datetime.now(timezone.utc)``.
|
||||||
|
|
||||||
|
.. deprecated:: 3.12
|
||||||
|
|
||||||
|
Use :meth:`datetime.now` with :attr:`UTC` instead.
|
||||||
|
|
||||||
|
|
||||||
.. classmethod:: datetime.fromtimestamp(timestamp, tz=None)
|
.. classmethod:: datetime.fromtimestamp(timestamp, tz=None)
|
||||||
|
|
||||||
|
@ -964,6 +968,10 @@ Other constructors, all class methods:
|
||||||
:c:func:`gmtime` function. Raise :exc:`OSError` instead of
|
:c:func:`gmtime` function. Raise :exc:`OSError` instead of
|
||||||
:exc:`ValueError` on :c:func:`gmtime` failure.
|
:exc:`ValueError` on :c:func:`gmtime` failure.
|
||||||
|
|
||||||
|
.. deprecated:: 3.12
|
||||||
|
|
||||||
|
Use :meth:`datetime.fromtimestamp` with :attr:`UTC` instead.
|
||||||
|
|
||||||
|
|
||||||
.. classmethod:: datetime.fromordinal(ordinal)
|
.. classmethod:: datetime.fromordinal(ordinal)
|
||||||
|
|
||||||
|
|
|
@ -1801,6 +1801,13 @@ class datetime(date):
|
||||||
@classmethod
|
@classmethod
|
||||||
def utcfromtimestamp(cls, t):
|
def utcfromtimestamp(cls, t):
|
||||||
"""Construct a naive UTC datetime from a POSIX timestamp."""
|
"""Construct a naive UTC datetime from a POSIX timestamp."""
|
||||||
|
import warnings
|
||||||
|
warnings.warn("datetime.utcfromtimestamp() is deprecated and scheduled "
|
||||||
|
"for removal in a future version. Use timezone-aware "
|
||||||
|
"objects to represent datetimes in UTC: "
|
||||||
|
"datetime.fromtimestamp(t, datetime.UTC).",
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2)
|
||||||
return cls._fromtimestamp(t, True, None)
|
return cls._fromtimestamp(t, True, None)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -1812,8 +1819,15 @@ class datetime(date):
|
||||||
@classmethod
|
@classmethod
|
||||||
def utcnow(cls):
|
def utcnow(cls):
|
||||||
"Construct a UTC datetime from time.time()."
|
"Construct a UTC datetime from time.time()."
|
||||||
|
import warnings
|
||||||
|
warnings.warn("datetime.utcnow() is deprecated and scheduled for "
|
||||||
|
"removal in a future version. Instead, Use timezone-aware "
|
||||||
|
"objects to represent datetimes in UTC: "
|
||||||
|
"datetime.now(datetime.UTC).",
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2)
|
||||||
t = _time.time()
|
t = _time.time()
|
||||||
return cls.utcfromtimestamp(t)
|
return cls._fromtimestamp(t, True, None)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def combine(cls, date, time, tzinfo=True):
|
def combine(cls, date, time, tzinfo=True):
|
||||||
|
|
|
@ -143,13 +143,13 @@ def formatdate(timeval=None, localtime=False, usegmt=False):
|
||||||
# 2822 requires that day and month names be the English abbreviations.
|
# 2822 requires that day and month names be the English abbreviations.
|
||||||
if timeval is None:
|
if timeval is None:
|
||||||
timeval = time.time()
|
timeval = time.time()
|
||||||
if localtime or usegmt:
|
dt = datetime.datetime.fromtimestamp(timeval, datetime.timezone.utc)
|
||||||
dt = datetime.datetime.fromtimestamp(timeval, datetime.timezone.utc)
|
|
||||||
else:
|
|
||||||
dt = datetime.datetime.utcfromtimestamp(timeval)
|
|
||||||
if localtime:
|
if localtime:
|
||||||
dt = dt.astimezone()
|
dt = dt.astimezone()
|
||||||
usegmt = False
|
usegmt = False
|
||||||
|
elif not usegmt:
|
||||||
|
dt = dt.replace(tzinfo=None)
|
||||||
return format_datetime(dt, usegmt)
|
return format_datetime(dt, usegmt)
|
||||||
|
|
||||||
def format_datetime(dt, usegmt=False):
|
def format_datetime(dt, usegmt=False):
|
||||||
|
|
|
@ -104,9 +104,9 @@ def time2isoz(t=None):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if t is None:
|
if t is None:
|
||||||
dt = datetime.datetime.utcnow()
|
dt = datetime.datetime.now(tz=datetime.UTC)
|
||||||
else:
|
else:
|
||||||
dt = datetime.datetime.utcfromtimestamp(t)
|
dt = datetime.datetime.fromtimestamp(t, tz=datetime.UTC)
|
||||||
return "%04d-%02d-%02d %02d:%02d:%02dZ" % (
|
return "%04d-%02d-%02d %02d:%02d:%02dZ" % (
|
||||||
dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)
|
dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)
|
||||||
|
|
||||||
|
@ -122,9 +122,9 @@ def time2netscape(t=None):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if t is None:
|
if t is None:
|
||||||
dt = datetime.datetime.utcnow()
|
dt = datetime.datetime.now(tz=datetime.UTC)
|
||||||
else:
|
else:
|
||||||
dt = datetime.datetime.utcfromtimestamp(t)
|
dt = datetime.datetime.fromtimestamp(t, tz=datetime.UTC)
|
||||||
return "%s, %02d-%s-%04d %02d:%02d:%02d GMT" % (
|
return "%s, %02d-%s-%04d %02d:%02d:%02d GMT" % (
|
||||||
DAYS[dt.weekday()], dt.day, MONTHS[dt.month-1],
|
DAYS[dt.weekday()], dt.day, MONTHS[dt.month-1],
|
||||||
dt.year, dt.hour, dt.minute, dt.second)
|
dt.year, dt.hour, dt.minute, dt.second)
|
||||||
|
|
|
@ -2437,7 +2437,8 @@ class TestDateTime(TestDate):
|
||||||
|
|
||||||
ts = time.time()
|
ts = time.time()
|
||||||
expected = time.gmtime(ts)
|
expected = time.gmtime(ts)
|
||||||
got = self.theclass.utcfromtimestamp(ts)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
got = self.theclass.utcfromtimestamp(ts)
|
||||||
self.verify_field_equality(expected, got)
|
self.verify_field_equality(expected, got)
|
||||||
|
|
||||||
# Run with US-style DST rules: DST begins 2 a.m. on second Sunday in
|
# Run with US-style DST rules: DST begins 2 a.m. on second Sunday in
|
||||||
|
@ -2483,8 +2484,12 @@ class TestDateTime(TestDate):
|
||||||
|
|
||||||
@support.run_with_tz('MSK-03') # Something east of Greenwich
|
@support.run_with_tz('MSK-03') # Something east of Greenwich
|
||||||
def test_microsecond_rounding(self):
|
def test_microsecond_rounding(self):
|
||||||
|
def utcfromtimestamp(*args, **kwargs):
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
return self.theclass.utcfromtimestamp(*args, **kwargs)
|
||||||
|
|
||||||
for fts in [self.theclass.fromtimestamp,
|
for fts in [self.theclass.fromtimestamp,
|
||||||
self.theclass.utcfromtimestamp]:
|
utcfromtimestamp]:
|
||||||
zero = fts(0)
|
zero = fts(0)
|
||||||
self.assertEqual(zero.second, 0)
|
self.assertEqual(zero.second, 0)
|
||||||
self.assertEqual(zero.microsecond, 0)
|
self.assertEqual(zero.microsecond, 0)
|
||||||
|
@ -2581,10 +2586,11 @@ class TestDateTime(TestDate):
|
||||||
self.theclass.fromtimestamp(ts)
|
self.theclass.fromtimestamp(ts)
|
||||||
|
|
||||||
def test_utcfromtimestamp_limits(self):
|
def test_utcfromtimestamp_limits(self):
|
||||||
try:
|
with self.assertWarns(DeprecationWarning):
|
||||||
self.theclass.utcfromtimestamp(-2**32 - 1)
|
try:
|
||||||
except (OSError, OverflowError):
|
self.theclass.utcfromtimestamp(-2**32 - 1)
|
||||||
self.skipTest("Test not valid on this platform")
|
except (OSError, OverflowError):
|
||||||
|
self.skipTest("Test not valid on this platform")
|
||||||
|
|
||||||
min_dt = self.theclass.min.replace(tzinfo=timezone.utc)
|
min_dt = self.theclass.min.replace(tzinfo=timezone.utc)
|
||||||
min_ts = min_dt.timestamp()
|
min_ts = min_dt.timestamp()
|
||||||
|
@ -2597,10 +2603,11 @@ class TestDateTime(TestDate):
|
||||||
("maximum", max_ts, max_dt.replace(tzinfo=None)),
|
("maximum", max_ts, max_dt.replace(tzinfo=None)),
|
||||||
]:
|
]:
|
||||||
with self.subTest(test_name, ts=ts, expected=expected):
|
with self.subTest(test_name, ts=ts, expected=expected):
|
||||||
try:
|
with self.assertWarns(DeprecationWarning):
|
||||||
actual = self.theclass.utcfromtimestamp(ts)
|
try:
|
||||||
except (OSError, OverflowError) as exc:
|
actual = self.theclass.utcfromtimestamp(ts)
|
||||||
self.skipTest(str(exc))
|
except (OSError, OverflowError) as exc:
|
||||||
|
self.skipTest(str(exc))
|
||||||
|
|
||||||
self.assertEqual(actual, expected)
|
self.assertEqual(actual, expected)
|
||||||
|
|
||||||
|
@ -2645,7 +2652,8 @@ class TestDateTime(TestDate):
|
||||||
|
|
||||||
@unittest.skipIf(sys.platform == "win32", "Windows doesn't accept negative timestamps")
|
@unittest.skipIf(sys.platform == "win32", "Windows doesn't accept negative timestamps")
|
||||||
def test_negative_float_utcfromtimestamp(self):
|
def test_negative_float_utcfromtimestamp(self):
|
||||||
d = self.theclass.utcfromtimestamp(-1.05)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
d = self.theclass.utcfromtimestamp(-1.05)
|
||||||
self.assertEqual(d, self.theclass(1969, 12, 31, 23, 59, 58, 950000))
|
self.assertEqual(d, self.theclass(1969, 12, 31, 23, 59, 58, 950000))
|
||||||
|
|
||||||
def test_utcnow(self):
|
def test_utcnow(self):
|
||||||
|
@ -2655,8 +2663,11 @@ class TestDateTime(TestDate):
|
||||||
# a second of each other.
|
# a second of each other.
|
||||||
tolerance = timedelta(seconds=1)
|
tolerance = timedelta(seconds=1)
|
||||||
for dummy in range(3):
|
for dummy in range(3):
|
||||||
from_now = self.theclass.utcnow()
|
with self.assertWarns(DeprecationWarning):
|
||||||
from_timestamp = self.theclass.utcfromtimestamp(time.time())
|
from_now = self.theclass.utcnow()
|
||||||
|
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
from_timestamp = self.theclass.utcfromtimestamp(time.time())
|
||||||
if abs(from_timestamp - from_now) <= tolerance:
|
if abs(from_timestamp - from_now) <= tolerance:
|
||||||
break
|
break
|
||||||
# Else try again a few times.
|
# Else try again a few times.
|
||||||
|
@ -2956,7 +2967,11 @@ class TestDateTime(TestDate):
|
||||||
constr_name=constr_name):
|
constr_name=constr_name):
|
||||||
constructor = getattr(base_obj, constr_name)
|
constructor = getattr(base_obj, constr_name)
|
||||||
|
|
||||||
dt = constructor(*constr_args)
|
if constr_name == "utcfromtimestamp":
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
dt = constructor(*constr_args)
|
||||||
|
else:
|
||||||
|
dt = constructor(*constr_args)
|
||||||
|
|
||||||
# Test that it creates the right subclass
|
# Test that it creates the right subclass
|
||||||
self.assertIsInstance(dt, DateTimeSubclass)
|
self.assertIsInstance(dt, DateTimeSubclass)
|
||||||
|
@ -2986,7 +3001,11 @@ class TestDateTime(TestDate):
|
||||||
for name, meth_name, kwargs in test_cases:
|
for name, meth_name, kwargs in test_cases:
|
||||||
with self.subTest(name):
|
with self.subTest(name):
|
||||||
constr = getattr(DateTimeSubclass, meth_name)
|
constr = getattr(DateTimeSubclass, meth_name)
|
||||||
dt = constr(**kwargs)
|
if constr == "utcnow":
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
dt = constr(**kwargs)
|
||||||
|
else:
|
||||||
|
dt = constr(**kwargs)
|
||||||
|
|
||||||
self.assertIsInstance(dt, DateTimeSubclass)
|
self.assertIsInstance(dt, DateTimeSubclass)
|
||||||
self.assertEqual(dt.extra, 7)
|
self.assertEqual(dt.extra, 7)
|
||||||
|
@ -4642,7 +4661,8 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
|
||||||
for dummy in range(3):
|
for dummy in range(3):
|
||||||
now = datetime.now(weirdtz)
|
now = datetime.now(weirdtz)
|
||||||
self.assertIs(now.tzinfo, weirdtz)
|
self.assertIs(now.tzinfo, weirdtz)
|
||||||
utcnow = datetime.utcnow().replace(tzinfo=utc)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
utcnow = datetime.utcnow().replace(tzinfo=utc)
|
||||||
now2 = utcnow.astimezone(weirdtz)
|
now2 = utcnow.astimezone(weirdtz)
|
||||||
if abs(now - now2) < timedelta(seconds=30):
|
if abs(now - now2) < timedelta(seconds=30):
|
||||||
break
|
break
|
||||||
|
@ -4676,7 +4696,8 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
|
||||||
|
|
||||||
# Try to make sure tz= actually does some conversion.
|
# Try to make sure tz= actually does some conversion.
|
||||||
timestamp = 1000000000
|
timestamp = 1000000000
|
||||||
utcdatetime = datetime.utcfromtimestamp(timestamp)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
utcdatetime = datetime.utcfromtimestamp(timestamp)
|
||||||
# In POSIX (epoch 1970), that's 2001-09-09 01:46:40 UTC, give or take.
|
# In POSIX (epoch 1970), that's 2001-09-09 01:46:40 UTC, give or take.
|
||||||
# But on some flavor of Mac, it's nowhere near that. So we can't have
|
# But on some flavor of Mac, it's nowhere near that. So we can't have
|
||||||
# any idea here what time that actually is, we can only test that
|
# any idea here what time that actually is, we can only test that
|
||||||
|
@ -4690,7 +4711,8 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
|
||||||
def test_tzinfo_utcnow(self):
|
def test_tzinfo_utcnow(self):
|
||||||
meth = self.theclass.utcnow
|
meth = self.theclass.utcnow
|
||||||
# Ensure it doesn't require tzinfo (i.e., that this doesn't blow up).
|
# Ensure it doesn't require tzinfo (i.e., that this doesn't blow up).
|
||||||
base = meth()
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
base = meth()
|
||||||
# Try with and without naming the keyword; for whatever reason,
|
# Try with and without naming the keyword; for whatever reason,
|
||||||
# utcnow() doesn't accept a tzinfo argument.
|
# utcnow() doesn't accept a tzinfo argument.
|
||||||
off42 = FixedOffset(42, "42")
|
off42 = FixedOffset(42, "42")
|
||||||
|
@ -4702,7 +4724,8 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
|
||||||
meth = self.theclass.utcfromtimestamp
|
meth = self.theclass.utcfromtimestamp
|
||||||
ts = time.time()
|
ts = time.time()
|
||||||
# Ensure it doesn't require tzinfo (i.e., that this doesn't blow up).
|
# Ensure it doesn't require tzinfo (i.e., that this doesn't blow up).
|
||||||
base = meth(ts)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
base = meth(ts)
|
||||||
# Try with and without naming the keyword; for whatever reason,
|
# Try with and without naming the keyword; for whatever reason,
|
||||||
# utcfromtimestamp() doesn't accept a tzinfo argument.
|
# utcfromtimestamp() doesn't accept a tzinfo argument.
|
||||||
off42 = FixedOffset(42, "42")
|
off42 = FixedOffset(42, "42")
|
||||||
|
@ -5309,7 +5332,7 @@ class TestTimezoneConversions(unittest.TestCase):
|
||||||
|
|
||||||
def test_fromutc(self):
|
def test_fromutc(self):
|
||||||
self.assertRaises(TypeError, Eastern.fromutc) # not enough args
|
self.assertRaises(TypeError, Eastern.fromutc) # not enough args
|
||||||
now = datetime.utcnow().replace(tzinfo=utc_real)
|
now = datetime.now(tz=utc_real)
|
||||||
self.assertRaises(ValueError, Eastern.fromutc, now) # wrong tzinfo
|
self.assertRaises(ValueError, Eastern.fromutc, now) # wrong tzinfo
|
||||||
now = now.replace(tzinfo=Eastern) # insert correct tzinfo
|
now = now.replace(tzinfo=Eastern) # insert correct tzinfo
|
||||||
enow = Eastern.fromutc(now) # doesn't blow up
|
enow = Eastern.fromutc(now) # doesn't blow up
|
||||||
|
@ -5411,9 +5434,11 @@ class Oddballs(unittest.TestCase):
|
||||||
self.assertEqual(datetime_sc, as_datetime)
|
self.assertEqual(datetime_sc, as_datetime)
|
||||||
|
|
||||||
def test_extra_attributes(self):
|
def test_extra_attributes(self):
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
utcnow = datetime.utcnow()
|
||||||
for x in [date.today(),
|
for x in [date.today(),
|
||||||
time(),
|
time(),
|
||||||
datetime.utcnow(),
|
utcnow,
|
||||||
timedelta(),
|
timedelta(),
|
||||||
tzinfo(),
|
tzinfo(),
|
||||||
timezone(timedelta())]:
|
timezone(timedelta())]:
|
||||||
|
@ -6073,6 +6098,7 @@ class ZoneInfo(tzinfo):
|
||||||
def transitions(self):
|
def transitions(self):
|
||||||
for (_, prev_ti), (t, ti) in pairs(zip(self.ut, self.ti)):
|
for (_, prev_ti), (t, ti) in pairs(zip(self.ut, self.ti)):
|
||||||
shift = ti[0] - prev_ti[0]
|
shift = ti[0] - prev_ti[0]
|
||||||
|
# TODO: Remove this use of utcfromtimestamp
|
||||||
yield datetime.utcfromtimestamp(t), shift
|
yield datetime.utcfromtimestamp(t), shift
|
||||||
|
|
||||||
def nondst_folds(self):
|
def nondst_folds(self):
|
||||||
|
|
|
@ -18,10 +18,13 @@ class RegressionTestResult(unittest.TextTestResult):
|
||||||
self.buffer = True
|
self.buffer = True
|
||||||
if self.USE_XML:
|
if self.USE_XML:
|
||||||
from xml.etree import ElementTree as ET
|
from xml.etree import ElementTree as ET
|
||||||
from datetime import datetime
|
from datetime import datetime, UTC
|
||||||
self.__ET = ET
|
self.__ET = ET
|
||||||
self.__suite = ET.Element('testsuite')
|
self.__suite = ET.Element('testsuite')
|
||||||
self.__suite.set('start', datetime.utcnow().isoformat(' '))
|
self.__suite.set('start',
|
||||||
|
datetime.now(UTC)
|
||||||
|
.replace(tzinfo=None)
|
||||||
|
.isoformat(' '))
|
||||||
self.__e = None
|
self.__e = None
|
||||||
self.__start_time = None
|
self.__start_time = None
|
||||||
|
|
||||||
|
|
|
@ -925,7 +925,7 @@ class TestBinaryPlistlib(unittest.TestCase):
|
||||||
# Issue #26709: 32-bit timestamp out of range
|
# Issue #26709: 32-bit timestamp out of range
|
||||||
for ts in -2**31-1, 2**31:
|
for ts in -2**31-1, 2**31:
|
||||||
with self.subTest(ts=ts):
|
with self.subTest(ts=ts):
|
||||||
d = (datetime.datetime.utcfromtimestamp(0) +
|
d = (datetime.datetime(1970, 1, 1, 0, 0) +
|
||||||
datetime.timedelta(seconds=ts))
|
datetime.timedelta(seconds=ts))
|
||||||
data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY)
|
data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY)
|
||||||
self.assertEqual(plistlib.loads(data), d)
|
self.assertEqual(plistlib.loads(data), d)
|
||||||
|
|
|
@ -517,7 +517,7 @@ class DateTimeTests(unittest.TestCase):
|
||||||
self.assertEqual(ts, ts2)
|
self.assertEqual(ts, ts2)
|
||||||
|
|
||||||
def test_sql_timestamp(self):
|
def test_sql_timestamp(self):
|
||||||
now = datetime.datetime.utcnow()
|
now = datetime.datetime.now(tz=datetime.UTC)
|
||||||
self.cur.execute("insert into test(ts) values (current_timestamp)")
|
self.cur.execute("insert into test(ts) values (current_timestamp)")
|
||||||
self.cur.execute("select ts from test")
|
self.cur.execute("select ts from test")
|
||||||
with self.assertWarnsRegex(DeprecationWarning, "converter"):
|
with self.assertWarnsRegex(DeprecationWarning, "converter"):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Deprecated :meth:`datetime.datetime.utcnow` and
|
||||||
|
:meth:`datetime.datetime.utcfromtimestamp`. (Patch by Paul Ganssle)
|
|
@ -5144,6 +5144,13 @@ datetime_datetime_now_impl(PyTypeObject *type, PyObject *tz)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
datetime_utcnow(PyObject *cls, PyObject *dummy)
|
datetime_utcnow(PyObject *cls, PyObject *dummy)
|
||||||
{
|
{
|
||||||
|
PyErr_WarnEx(
|
||||||
|
PyExc_DeprecationWarning,
|
||||||
|
"datetime.utcnow() is deprecated and scheduled for removal in a future "
|
||||||
|
"version. Use timezone-aware objects to represent datetimes in UTC: "
|
||||||
|
"datetime.now(datetime.UTC).",
|
||||||
|
2
|
||||||
|
);
|
||||||
return datetime_best_possible(cls, _PyTime_gmtime, Py_None);
|
return datetime_best_possible(cls, _PyTime_gmtime, Py_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5180,6 +5187,13 @@ datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
datetime_utcfromtimestamp(PyObject *cls, PyObject *args)
|
datetime_utcfromtimestamp(PyObject *cls, PyObject *args)
|
||||||
{
|
{
|
||||||
|
PyErr_WarnEx(
|
||||||
|
PyExc_DeprecationWarning,
|
||||||
|
"datetime.utcfromtimestamp() is deprecated and scheduled for removal "
|
||||||
|
"in a future version. Use timezone-aware objects to represent "
|
||||||
|
"datetimes in UTC: datetime.now(datetime.UTC).",
|
||||||
|
2
|
||||||
|
);
|
||||||
PyObject *timestamp;
|
PyObject *timestamp;
|
||||||
PyObject *result = NULL;
|
PyObject *result = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue