【问题标题】:Convert an aware timezone to UIC timezone with zoneinfo (migration away from pytz)使用 zoneinfo 将感知时区转换为 UIC 时区(从 pytz 迁移)
【发布时间】:2022-01-11 21:32:00
【问题描述】:

我使用的是 Python 3.8,所以我使用 https://pypi.org/project/backports.zoneinfo/ 来获取 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) 有区域信息吗?

【问题讨论】:

  • 也许弃用 shim 可以让你继续前进? pytz-deprecation-shim.readthedocs.io/en/latest (此外,使用 UTC,即使使用 pytz,您也不需要本地化。您可以直接设置 tzinfo)
  • pytz: The Fastest Footgun in the West ... 真有趣 =)

标签: python datetime timezone zoneinfo


【解决方案1】:

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 以系统时区表示。

【讨论】:

    【解决方案2】:

    @MrFuppes 提供的链接:https://blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html 解释说 pytz 及其本地化方法不是标准的。现在有了区域信息,我们就可以使用简单的标准 API,而不必担心会中枪:

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

    变成

    my_datetime.astimezone(timezone.utc)
    

    日期算术现在即使没有 UTC 日期时间也可以工作。

    【讨论】:

    • 请运行您的代码以确认它可能是错误的。
    猜你喜欢
    • 2012-08-29
    • 2021-09-06
    • 2018-01-03
    • 2019-06-19
    • 2015-10-05
    • 2016-02-05
    • 1970-01-01
    • 2014-10-05
    • 2020-04-15
    相关资源
    最近更新 更多