使用 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
所以我正在执行从 pytz
到 zoneinfo
的更改
用 pytz 就可以 from pytz import UTC
。 python documentation 从 datetime.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在系统时区中表示。
我正在使用 Python 3.8,所以我正在使用 https://pypi.org/project/backports.zoneinfo/ 来获取区域信息。 Django 不赞成使用 pytz
所以我正在执行从 pytz
到 zoneinfo
用 pytz 就可以 from pytz import UTC
。 python documentation 从 datetime.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在系统时区中表示。