从日期字符串加上小时偏移量创建日期时间无法跨 DST 边界工作

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

我正处于学习 Python 的早期阶段,并且正在努力正确处理 DST 时间更改。我有包含日期列和小时列的 CSV 数据,我正在尝试从中创建一个时区感知的日期时间。 CSV 数据采用美国东部标准时间(现行),但数据本身不包含此信息。

因此,2024 年 11 月 3 日(秋季时间更改的日期),我们将有 25 个小时。我的日期字段将只是“2024-11-03”,小时字段的范围将从 0 到 24。

使用使用 datetime.strptime 加载时指定时区中的内容,我尝试了以下操作:

for i in range(25):
    dt = datetime.fromisoformat('2024-11-03').replace(tzinfo=ZoneInfo("America/New_York"))
    dt += timedelta(hours=i)
    print(dt.timestamp() , '->' , dt.strftime('%Y-%m-%d %H:%M:%S %z'))

结果是:

1730606400.0 -> 2024-11-03 00:00:00 -0400
1730610000.0 -> 2024-11-03 01:00:00 -0400
1730617200.0 -> 2024-11-03 02:00:00 -0500
1730620800.0 -> 2024-11-03 03:00:00 -0500
...
1730692800.0 -> 2024-11-03 23:00:00 -0500
1730696400.0 -> 2024-11-04 00:00:00 -0500

不太正确。

如果我用 PHP(我精通)执行几乎相同的代码,我会得到预期的结果:

1730606400 -> 2024-11-03T00:00:00-04:00
1730610000 -> 2024-11-03T01:00:00-04:00
1730613600 -> 2024-11-03T01:00:00-05:00
1730617200 -> 2024-11-03T02:00:00-05:00
...
1730689200 -> 2024-11-03T22:00:00-05:00
1730692800 -> 2024-11-03T23:00:00-05:00

很明显,我在 Python 中的方法不喜欢时间变化本身。所以我尝试转换为时间戳并手动添加秒数,但它也不起作用:

for i in range(25):
    dt = datetime.fromisoformat('2024-11-03').replace(tzinfo=ZoneInfo("America/New_York"))
    dt = dt.fromtimestamp(dt.timestamp() + i*3600).replace(tzinfo=ZoneInfo("America/New_York"))
    print(dt.timestamp() , '->' , dt.strftime('%Y-%m-%d %H:%M:%S %z'))

我还看到了这个:将 25 小时(DST)转换为日期时间,但这似乎也没有解决我的问题。

我确信这里一定有一个简单的解决方案......

python datetime dst
1个回答
0
投票

我发现先将日期时间转换为 utc,然后添加时间增量,然后转换回 EST 已成功。

from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

for i in range(25):
    dt = datetime.fromisoformat('2024-11-03').replace(tzinfo=ZoneInfo("America/New_York"))
    dt = dt.astimezone()
    dt += timedelta(hours=i)
    dt = dt.astimezone(ZoneInfo("America/New_York"))
    print(dt.timestamp() , '->' , dt.strftime('%Y-%m-%d %H:%M:%S %z'))

输出:

1730606400.0 -> 2024-11-03 00:00:00 -0400
1730610000.0 -> 2024-11-03 01:00:00 -0400
1730613600.0 -> 2024-11-03 01:00:00 -0500
1730617200.0 -> 2024-11-03 02:00:00 -0500
1730620800.0 -> 2024-11-03 03:00:00 -0500
...
1730692800.0 -> 2024-11-03 23:00:00 -0500
© www.soinside.com 2019 - 2024. All rights reserved.