我正在使用 pytz 库在 python 中进行一些日期时间数学计算(尽管如果需要的话我愿意使用其他库)。我有一个迭代器,每次循环迭代都需要增加一天。当东部时区从 11 月 3 日过渡到 11 月 4 日时,就会出现问题,这会跨越夏令时边界(11 月 3 日开始到 11 月 5 日开始之间有 25 个小时,而不是通常的 24 个小时)。每当我添加一个跨越边界的“天”时,我得到的时间是未来 24 小时,而不是预期的 25 小时。
这是我尝试过的:
import datetime
import pytz
ET = pytz.timezone("US/Eastern")
first_day = ET.localize(datetime.datetime(2024, 11, 3))
next_day = first_day + datetime.timedelta(days=1)
first_day.isoformat() # '2024-11-03T00:00:00-04:00'
next_day.isoformat() # '2024-11-04T00:00:00-04:00'
assert next_day == ET.localize(datetime.datetime(2024, 11, 4)) # This fails!!
# I want next_day to be '2024-11-04T00:00:00-05:00' or '2024-11-04T01:00:00-04:00'
我也尝试在那里扔一个
normalize()
,但这也没有产生正确的结果:
ET.normalize(next_day).isoformat() # '2024-11-03T23:00:00-05:00'
(这比我想要的输出早了一小时)
我想我可以复制我的 start_day 来增加
day
字段,但随后我必须知道月份和年份的界限,这对我来说似乎并不理想。
您似乎想要“挂钟时间”,即第二天的“挂钟”时间,无论夏令时如何转换。 我会使用内置的
zoneinfo
模块。 如果使用 Windows 以获得最新时区信息,您可能需要安装“第一方”tzdata
模块 (pip install tzdata
):
import datetime as dt
import zoneinfo as zi
ET = zi.ZoneInfo('US/Eastern')
first_day = dt.datetime(2024, 11, 3, tzinfo=ET)
next_day = first_day + dt.timedelta(days=1)
print(first_day.isoformat())
print(next_day.isoformat())
assert next_day == dt.datetime(2024, 11, 4, tzinfo=ET)
输出:
2024-11-03T00:00:00-04:00
2024-11-04T00:00:00-05:00