如何强制 pytz 使用当前标准时区?

Ken*_*der 2 python timezone datetime pytz

考虑以下:

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'))
Run Code Online (Sandbox Code Playgroud)

我现在有一个日期时间对象,代表纽约 1 月 1 日午夜。奇怪的是,如果我使用 pytz 将其转换为 UTC,我会得到一个奇怪的日期时间,相差几分钟:

new_years_in_new_york.astimezone(pytz.utc)
# datetime.datetime(2020, 1, 1, 4, 56, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)

请注意,纽约的午夜(以 pytz 表示)是UTC 时间的4:56。在 Stack Overflow 上的其他地方,我了解到这是因为pytz 使用您的/usr/share/zoneinfo数据,该数据在标准化之前使用本地平均时间来考虑时区。这可以在这里显示:

pytz.timezone('US/Eastern')
# <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>
Run Code Online (Sandbox Code Playgroud)

看到了吗LMK-1 day, 19:04:00 STD?这是当地平均时间偏移,不是我想要的偏移,这是美国/东部时间而不是夏令时。

有没有办法强制 pytz 使用当前基于当前日期的标准偏移量集?2020 年新年,应该是 UTC-5。如果我提供的日期是在夏令时期间,我需要 UTC-4。我很困惑为什么 pytz 会在 2020 年日期使用基于 LMT 的偏移量。

dec*_*eze 5

>>> new_years_in_new_york\ndatetime.datetime(2020, 1, 1, 0, 0, tzinfo=<DstTzInfo \'US/Eastern\' LMT-1 day, 19:04:00 STD>)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意该日期时间中的奇数偏移量。您没有正确创建此日期时间。

\n
\n

该库仅支持两种构建本地化时间的方法。首先是使用localize()pytz 库提供的方法。这用于本地化原始日期时间(datetime没有时区信息):

\n
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))\n>>> print(loc_dt.strftime(fmt))\n2002-10-27 06:00:00 EST-0500\n
Run Code Online (Sandbox Code Playgroud)\n

构建本地化时间的第二种方法是使用标准astimezone()方法转换\n现有的本地化时间:

\n
>>> ams_dt = loc_dt.astimezone(amsterdam)\n>>> ams_dt.strftime(fmt)\n\'2002-10-27 12:00:00 CET+0100\'\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,对于许多时区,使用tzinfo标准datetime构造函数 \xe2\x80\x98\xe2\x80\x99 的参数对于 pytz 不起作用 \xe2\x80\x99\xe2\x80\x99 。

\n
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)\n\'2002-10-27 12:00:00 LMT+0020\'\n
Run Code Online (Sandbox Code Playgroud)\n

http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

\n
\n