使用 zoneinfo 将感知时区转换为 UIC 时区(从 pytz 迁移)

Convert an aware timezone to UIC timezone with zoneinfo (migration away from pytz)

我正在使用 Python 3.8,所以我正在使用 https://pypi.org/project/backports.zoneinfo/ 来获取区域信息。 Django 不赞成使用 pytz 所以我正在执行从 pytzzoneinfo

的更改

用 pytz 就可以 from pytz import UTCpython documentationdatetime.timezone.utc' (and this does not have a localize` 方法获取它。

如何执行与此等效的操作: pytz.UTC.localize(my_datetime, is_dst=None) 使用区域信息?

link @MrFuppes 提供:https://blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html 解释说 pytz 及其本地化方法是 none 标准。现在有了区域信息,我们可以使用一个简单的标准 API 而不用担心搬起石头砸自己的脚:

pytz.UTC.localize(my_datetime, is_dst=None)

变成

my_datetime.astimezone(timezone.utc)

日期算法现在甚至可以使用 none UTC 日期时间。

pytz.localize 仅适用于原始日期时间(没有时区信息的日期时间),因此

import datetime
import pytz
my_datetime = datetime.datetime(2021, 10, 31, 2)
pytz.UTC.localize(my_datetime, is_dst=None)
# -> datetime.datetime(2021, 10, 31, 2, 0, tzinfo=<UTC>)

相应的 pytz-less 结构是

my_datetime.replace(tzinfo=datetime.timezone.utc)
# -> datetime.datetime(2021, 10, 31, 2, 0, tzinfo=datetime.timezone.utc)

注意:不要使用my_datetime.astimezone(timezone.utc),因为这将假设my_datetime在系统时区中表示。