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:
Kabir Kwatra 2022-05-03 15:14:25 -07:00 committed by GitHub
parent ee2205b208
commit 48c6165c28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 23 additions and 3 deletions

View File

@ -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
--------------- ---------------

View File

@ -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.

View File

@ -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))

View File

@ -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

View File

@ -0,0 +1,3 @@
Add `datetime.UTC` alias for `datetime.timezone.utc`.
Patch by Kabir Kwatra.

View File

@ -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.
*/ */