From 48c6165c28dfb40eafd2fa6de9bebd14fbc7c95c Mon Sep 17 00:00:00 2001 From: Kabir Kwatra Date: Tue, 3 May 2022 15:14:25 -0700 Subject: 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 ``` --- Doc/library/datetime.rst | 6 ++++++ Lib/datetime.py | 5 +++-- Lib/test/datetimetester.py | 7 ++++++- Misc/ACKS | 1 + .../next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst | 3 +++ Modules/_datetimemodule.c | 4 ++++ 6 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index f447b7b..ca17dc8 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -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. :const:`MAXYEAR` is ``9999``. +.. attribute:: UTC + + Alias for the UTC timezone singleton :attr:`datetime.timezone.utc`. + + .. versionadded:: 3.11 + Available Types --------------- diff --git a/Lib/datetime.py b/Lib/datetime.py index 260b1de..7f79aa4 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -5,7 +5,7 @@ time zone and DST data sources. """ __all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", - "MINYEAR", "MAXYEAR") + "MINYEAR", "MAXYEAR", "UTC") import time as _time @@ -2290,7 +2290,8 @@ class timezone(tzinfo): return f'UTC{sign}{hours:02d}:{minutes:02d}:{seconds: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 # compatibility, even though the constructor will accept a wider range of # values. This may change in the future. diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 335cded..d85b546 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -28,6 +28,7 @@ from datetime import timedelta from datetime import tzinfo from datetime import time from datetime import timezone +from datetime import UTC from datetime import date, datetime import time as _time @@ -66,6 +67,9 @@ class TestModule(unittest.TestCase): self.assertEqual(datetime.MINYEAR, 1) self.assertEqual(datetime.MAXYEAR, 9999) + def test_utc_alias(self): + self.assertIs(UTC, timezone.utc) + def test_all(self): """Test that __all__ only points to valid attributes.""" all_attrs = dir(datetime_module) @@ -81,7 +85,7 @@ class TestModule(unittest.TestCase): if not name.startswith('__') and not name.endswith('__')) allowed = set(['MAXYEAR', 'MINYEAR', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', - 'tzinfo', 'sys']) + 'tzinfo', 'UTC', 'sys']) self.assertEqual(names - allowed, set([])) def test_divide_and_round(self): @@ -310,6 +314,7 @@ class TestTimeZone(unittest.TestCase): def test_tzname(self): self.assertEqual('UTC', timezone.utc.tzname(None)) + self.assertEqual('UTC', UTC.tzname(None)) self.assertEqual('UTC', timezone(ZERO).tzname(None)) self.assertEqual('UTC-05:00', timezone(-5 * HOUR).tzname(None)) self.assertEqual('UTC+09:30', timezone(9.5 * HOUR).tzname(None)) diff --git a/Misc/ACKS b/Misc/ACKS index 1efc6a0..ec4de61 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -987,6 +987,7 @@ Toshio Kuratomi Ilia Kurenkov Vladimir Kushnir Erno Kuusela +Kabir Kwatra Ross Lagerwall Cameron Laird Loïc Lajeanne diff --git a/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst b/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst new file mode 100644 index 0000000..35838c7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst @@ -0,0 +1,3 @@ +Add `datetime.UTC` alias for `datetime.timezone.utc`. + +Patch by Kabir Kwatra. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 24c2198..20cdb18 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6634,6 +6634,10 @@ _datetime_exec(PyObject *module) 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 * pasting together 4 single years. */ -- cgit v0.12