在 python (pytz) 中,如何以 DST 感知方式向日期时间添加“日”? (有时结果应该是未来23或25小时)

问题描述 投票:0回答:1

我正在使用 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
字段,但随后我必须知道月份和年份的界限,这对我来说似乎并不理想。

python datetime timezone python-datetime pytz
1个回答
0
投票

您似乎想要“挂钟时间”,即第二天的“挂钟”时间,无论夏令时如何转换。 我会使用内置的

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
© www.soinside.com 2019 - 2024. All rights reserved.