mirror of https://github.com/python/cpython.git
gh-91928: Add `datetime.UTC` alias for `datetime.timezone.utc` (GH-91973)
### fixes #91928 `UTC` is now module attribute aliased to `datetime.timezone.utc`. You can now do the following: ```python from datetime import UTC ```
This commit is contained in:
parent
ee2205b208
commit
48c6165c28
|
@ -84,6 +84,12 @@ The :mod:`datetime` module exports the following constants:
|
||||||
The largest year number allowed in a :class:`date` or :class:`.datetime` object.
|
The largest year number allowed in a :class:`date` or :class:`.datetime` object.
|
||||||
:const:`MAXYEAR` is ``9999``.
|
:const:`MAXYEAR` is ``9999``.
|
||||||
|
|
||||||
|
.. attribute:: UTC
|
||||||
|
|
||||||
|
Alias for the UTC timezone singleton :attr:`datetime.timezone.utc`.
|
||||||
|
|
||||||
|
.. versionadded:: 3.11
|
||||||
|
|
||||||
Available Types
|
Available Types
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo",
|
__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo",
|
||||||
"MINYEAR", "MAXYEAR")
|
"MINYEAR", "MAXYEAR", "UTC")
|
||||||
|
|
||||||
|
|
||||||
import time as _time
|
import time as _time
|
||||||
|
@ -2290,7 +2290,8 @@ def _name_from_offset(delta):
|
||||||
return f'UTC{sign}{hours:02d}:{minutes:02d}:{seconds:02d}'
|
return f'UTC{sign}{hours:02d}:{minutes:02d}:{seconds:02d}'
|
||||||
return f'UTC{sign}{hours:02d}:{minutes:02d}'
|
return f'UTC{sign}{hours:02d}:{minutes:02d}'
|
||||||
|
|
||||||
timezone.utc = timezone._create(timedelta(0))
|
UTC = timezone.utc = timezone._create(timedelta(0))
|
||||||
|
|
||||||
# bpo-37642: These attributes are rounded to the nearest minute for backwards
|
# bpo-37642: These attributes are rounded to the nearest minute for backwards
|
||||||
# compatibility, even though the constructor will accept a wider range of
|
# compatibility, even though the constructor will accept a wider range of
|
||||||
# values. This may change in the future.
|
# values. This may change in the future.
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
from datetime import tzinfo
|
from datetime import tzinfo
|
||||||
from datetime import time
|
from datetime import time
|
||||||
from datetime import timezone
|
from datetime import timezone
|
||||||
|
from datetime import UTC
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
import time as _time
|
import time as _time
|
||||||
|
|
||||||
|
@ -66,6 +67,9 @@ def test_constants(self):
|
||||||
self.assertEqual(datetime.MINYEAR, 1)
|
self.assertEqual(datetime.MINYEAR, 1)
|
||||||
self.assertEqual(datetime.MAXYEAR, 9999)
|
self.assertEqual(datetime.MAXYEAR, 9999)
|
||||||
|
|
||||||
|
def test_utc_alias(self):
|
||||||
|
self.assertIs(UTC, timezone.utc)
|
||||||
|
|
||||||
def test_all(self):
|
def test_all(self):
|
||||||
"""Test that __all__ only points to valid attributes."""
|
"""Test that __all__ only points to valid attributes."""
|
||||||
all_attrs = dir(datetime_module)
|
all_attrs = dir(datetime_module)
|
||||||
|
@ -81,7 +85,7 @@ def test_name_cleanup(self):
|
||||||
if not name.startswith('__') and not name.endswith('__'))
|
if not name.startswith('__') and not name.endswith('__'))
|
||||||
allowed = set(['MAXYEAR', 'MINYEAR', 'date', 'datetime',
|
allowed = set(['MAXYEAR', 'MINYEAR', 'date', 'datetime',
|
||||||
'datetime_CAPI', 'time', 'timedelta', 'timezone',
|
'datetime_CAPI', 'time', 'timedelta', 'timezone',
|
||||||
'tzinfo', 'sys'])
|
'tzinfo', 'UTC', 'sys'])
|
||||||
self.assertEqual(names - allowed, set([]))
|
self.assertEqual(names - allowed, set([]))
|
||||||
|
|
||||||
def test_divide_and_round(self):
|
def test_divide_and_round(self):
|
||||||
|
@ -310,6 +314,7 @@ def test_dst(self):
|
||||||
|
|
||||||
def test_tzname(self):
|
def test_tzname(self):
|
||||||
self.assertEqual('UTC', timezone.utc.tzname(None))
|
self.assertEqual('UTC', timezone.utc.tzname(None))
|
||||||
|
self.assertEqual('UTC', UTC.tzname(None))
|
||||||
self.assertEqual('UTC', timezone(ZERO).tzname(None))
|
self.assertEqual('UTC', timezone(ZERO).tzname(None))
|
||||||
self.assertEqual('UTC-05:00', timezone(-5 * HOUR).tzname(None))
|
self.assertEqual('UTC-05:00', timezone(-5 * HOUR).tzname(None))
|
||||||
self.assertEqual('UTC+09:30', timezone(9.5 * HOUR).tzname(None))
|
self.assertEqual('UTC+09:30', timezone(9.5 * HOUR).tzname(None))
|
||||||
|
|
|
@ -987,6 +987,7 @@ Toshio Kuratomi
|
||||||
Ilia Kurenkov
|
Ilia Kurenkov
|
||||||
Vladimir Kushnir
|
Vladimir Kushnir
|
||||||
Erno Kuusela
|
Erno Kuusela
|
||||||
|
Kabir Kwatra
|
||||||
Ross Lagerwall
|
Ross Lagerwall
|
||||||
Cameron Laird
|
Cameron Laird
|
||||||
Loïc Lajeanne
|
Loïc Lajeanne
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Add `datetime.UTC` alias for `datetime.timezone.utc`.
|
||||||
|
|
||||||
|
Patch by Kabir Kwatra.
|
|
@ -6634,6 +6634,10 @@ _datetime_exec(PyObject *module)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PyModule_AddObjectRef(module, "UTC", PyDateTime_TimeZone_UTC) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* A 4-year cycle has an extra leap day over what we'd get from
|
/* A 4-year cycle has an extra leap day over what we'd get from
|
||||||
* pasting together 4 single years.
|
* pasting together 4 single years.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue