# HG changeset patch # User ijl <ijl@mailbox.org> # Date 1602021408 0 # Tue Oct 06 21:56:48 2020 +0000 # Node ID 4dae33e1744f23c64b1e043b58a0553fa04e6320 # Parent 30ec207c30c8ed3880a6fadcc8c3d2e0bbacba79 Test zoneinfo diff --git a/README.md b/README.md --- a/README.md +++ b/README.md @@ -658,9 +658,9 @@ compatible with `isoformat()` in the standard library. ```python ->>> import orjson, datetime, pendulum +>>> import orjson, datetime, zoneinfo >>> orjson.dumps( - datetime.datetime(2018, 12, 1, 2, 3, 4, 9, tzinfo=pendulum.timezone('Australia/Adelaide')) + datetime.datetime(2018, 12, 1, 2, 3, 4, 9, tzinfo=zoneinfo.ZoneInfo('Australia/Adelaide')) ) b'"2018-12-01T02:03:04.000009+10:30"' >>> orjson.dumps( @@ -674,8 +674,9 @@ ``` `datetime.datetime` supports instances with a `tzinfo` that is `None`, -`datetime.timezone.utc` or a timezone instance from -the `pendulum`, `pytz`, or `dateutil`/`arrow` libraries. +`datetime.timezone.utc`, a timezone instance from the python3.9+ `zoneinfo` +module, or a timezone instance from the third-party `pendulum`, `pytz`, or +`dateutil`/`arrow` libraries. `datetime.time` objects must not have a `tzinfo`. diff --git a/test/test_datetime.py b/test/test_datetime.py --- a/test/test_datetime.py +++ b/test/test_datetime.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import datetime +import sys import unittest import pytest @@ -14,6 +15,9 @@ except ImportError: pendulum = None # type: ignore +if sys.version_info >= (3, 9): + import zoneinfo + class DatetimeTests(unittest.TestCase): def test_datetime_naive(self): @@ -101,6 +105,46 @@ b'["2018-06-01T02:03:04+00:00"]', ) + @unittest.skipIf(sys.version_info < (3, 9), "zoneinfo not available") + def test_datetime_zoneinfo_positive(self): + self.assertEqual( + orjson.dumps( + [ + datetime.datetime( + 2018, + 1, + 1, + 2, + 3, + 4, + 0, + tzinfo=zoneinfo.ZoneInfo("Asia/Shanghai"), + ) + ] + ), + b'["2018-01-01T02:03:04+08:00"]', + ) + + @unittest.skipIf(sys.version_info < (3, 9), "zoneinfo not available") + def test_datetime_zoneinfo_negative(self): + self.assertEqual( + orjson.dumps( + [ + datetime.datetime( + 2018, + 6, + 1, + 2, + 3, + 4, + 0, + tzinfo=zoneinfo.ZoneInfo("America/New_York"), + ) + ] + ), + b'["2018-06-01T02:03:04-04:00"]', + ) + @pytest.mark.skipif(pendulum is None, reason="pendulum install broken on win") def test_datetime_pendulum_utc(self): """