如何强制 pytz 使用当前的标准时区?
Posted
技术标签:
【中文标题】如何强制 pytz 使用当前的标准时区?【英文标题】:How can I force pytz to use currently standard timezones? 【发布时间】:2020-12-01 04:44:13 【问题描述】:考虑以下几点:
from datetime import datetime
import pytz
new_years_in_new_york = datetime(
year=2020,
month=1,
day=1,
hour=0,
minute=0,
tzinfo = pytz.timezone('US/Eastern'))
我现在有一个日期时间对象,它代表纽约的 1 月 1 日午夜。奇怪的是,如果我使用 pytz 将其转换为 UTC,我会得到一个奇怪的 datetime 几分钟:
new_years_in_new_york.astimezone(pytz.utc)
# datetime.datetime(2020, 1, 1, 4, 56, tzinfo=<UTC>)
请注意,纽约的 pytz 午夜是世界协调时 4:56。在 Stack Overflow 的其他地方,我了解到这是因为 pytz uses your /usr/share/zoneinfo
数据,它使用 本地平均时间 来说明标准化之前的时区。这可以在这里显示:
pytz.timezone('US/Eastern')
# <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>
看到LMK-1 day, 19:04:00 STD
了吗?这是当地的平均时间偏移量,而不是我想要的偏移量,在夏令时是美国/东部不是。
有没有一种方法可以强制 pytz 使用基于当前日期的当前标准偏移量集?在 2020 年新年,它应该只是 UTC-5。如果我提供的日期是在夏令时,我会想要 UTC-4。我很困惑为什么 pytz 会在 2020 日期使用基于 LMT 的偏移量。
【问题讨论】:
脚上的这个镜头正是你不应该再使用 pytz 的原因。请改用标准库 zoneinfo。 @WolfgangKuehn 但zoneinfo
会反过来产生同样的问题吗?例如,如果我尝试获取 1850 年某个日期的偏移量,它会提供今天的偏移量吗?我认为pytz
的localize
是正确的。
@WolfgangKuehn 请忽略我的问题,我在网上找到了 Python 3.9 的一个版本,并与zoneinfo
玩过。它确实调整了utcoffset
的应用日期。
这能回答你的问题吗? Weird timezone issue with pytz
还有另一个副本:Python pytz timezone function returns a timezone that is off by 9 minute
【参考方案1】:
>>> new_years_in_new_york
datetime.datetime(2020, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
注意那个日期时间的奇数偏移。您没有正确创建此日期时间。
该库仅支持两种构建本地化时间的方法。这 首先是使用pytz库提供的
localize()
方法。 这用于本地化一个幼稚的日期时间(datetime
没有时区 信息):>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) >>> print(loc_dt.strftime(fmt)) 2002-10-27 06:00:00 EST-0500
构建本地化时间的第二种方法是将 使用标准
astimezone()
方法的现有本地化时间:>>> ams_dt = loc_dt.astimezone(amsterdam) >>> ams_dt.strftime(fmt) '2002-10-27 12:00:00 CET+0100'
不幸的是,使用标准
datetime
的tzinfo
参数 对于许多时区,构造函数对 pytz “不起作用”。>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) '2002-10-27 12:00:00 LMT+0020'
http://pytz.sourceforge.net/#localized-times-and-date-arithmetic
【讨论】:
以上是关于如何强制 pytz 使用当前的标准时区?的主要内容,如果未能解决你的问题,请参考以下文章