Python timedelta 跨越 DST 转换返回不正确的结果?

标签 python datetime timezone timedelta

夏令时于 2021 年 3 月 14 日凌晨 2 点开始。

使用 Python zoneinfo 创建时区感知日期时间,如下所示:

import zoneinfo
from datetime import datetime

tz = zoneinfo.ZoneInfo("US/Eastern")

d0 = datetime(2021, 3, 13, 23, tzinfo=tz)
d1 = datetime(2021, 3, 14, 7, tzinfo=tz)
print(d0, d1, (d1 - d0).total_seconds() / 60 / 60)

我收到输出:

2021-03-13 23:00:00-05:00 2021-03-14 07:00:00-04:00 8.0

Python 正确地“看到”了这些值之间的 UTC 偏移量转换(-5 与 -4),但为什么生成的时间增量等于 8 而不是 7?

就其值(value)而言,按如下方式创建时区感知日期时间会产生完全相同的结果:

d0 = datetime(2021, 3, 13, 23).replace(tzinfo=tz)
d1 = datetime(2021, 3, 14, 7).replace(tzinfo=tz)

最佳答案

感谢对我原来问题的讨论以及我从 blog post by Paul Ganssle 中获得的理解,我将我的 timedelta.total_seconds() 数学替换为:

d1.timestamp() - d0.timestamp()

这给出了我所追求的正确的“实际”时间跨度值。

关于Python timedelta 跨越 DST 转换返回不正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71428364/

相关文章:

python - Django - 从单独的应用程序导入 View

python - 为什么在 __init__ 函数中声明描述符类会破坏描述符功能?

c# - 将 Java 日期字符串转换为 C# 日期时间

javascript - 有没有办法在 Javascript `Date` 对象中表示 2012 年 10 月 21 日?

php - 获取用户时区

python - Google App Engine Python 数据存储

python - 为什么这段 C 代码通过 Python 的 ctypes 运行时的执行速度是直接运行时的一半?

.net - 在不同文化中使用 DateTime 的最佳实践是什么

C# 到 Excel 设置自定义日期显示和值

.net - 如何获取系统的动态时区