使用具有共同时区的 PYTZ 时出现意外的 UTC 小时偏移量 [重复]

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

我无法理解使用

pytz
时区偏移的影响。

我从 UTC 时间开始,如下所示:

>>> utc = datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=pytz.timezone("UTC"))

现在我在 EST 中使用相同的挂钟时间,即向西 5 个标准子午线,并且(我相信)应该相差 5 个小时。

>>> est = datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=pytz.timezone("US/Eastern"))
>>> est-utc
datetime.timedelta(seconds=17760)
>>> 17760/3600
4.933333333333334

这个差距不是我想象的5个小时,而是4小时56分,短了4分钟

继续向西,我尝试连续提前一小时到达:

>>> cst = datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=pytz.timezone("US/Central"))
>>> cst-utc
datetime.timedelta(seconds=21060)
>>> 21060/3600
5.85

这个差异不是预期的 6 小时,而是 5 小时 51 分,短了 9 分钟。

>>> mst = datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=pytz.timezone("US/Mountain"))
>>> mst-utc
datetime.timedelta(seconds=25200)
>>> 25200/3600
7.0

这会产生预期的 7 小时差异。

>>> pst = datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=pytz.timezone("US/Pacific"))
>>> pst-utc
datetime.timedelta(seconds=28380)
>>> 28380/3600
7.883333333333334

现在差别不是预期的8小时,而是7小时53分,短了7分钟。

如果我显示时间,这就是我得到的:

>>> est
datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
>>> cst
datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=<DstTzInfo 'US/Central' LMT-1 day, 18:09:00 STD>)
>>> mst
datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=<DstTzInfo 'US/Mountain' LMT-1 day, 17:00:00 STD>)
>>> pst
datetime.datetime(2021, 3, 5, 7, 59, 58, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)

因此

datetime
充分意识到这些时间的 UTC 偏移量与预期的偶数小时分别相差 4、9、0 和 7 分钟。

显然我对这些时区偏移应该如何工作的期望是不正确的。

我再次尝试使用更简单的时区名称:

pytz
识别 EST 和 CST,并为它们生成预期的整小时偏移量,但拒绝 MST 和 PST。

现在,我在 Windows 10 上获得了这些结果,并且我已经可以听到这样的答案:“啊,好吧,Windows,每个人都知道 Windows 上的时区很奇怪”(这是事实),但事实并非如此很奇怪,而且,我从 Linux 上的 Python 3.8 得到的结果与上面显示的结果相同。

我在这里缺少什么?

python datetime timezone pytz
2个回答
1
投票

我知道有点晚了,但看看这里的答案:

pytz 的奇怪时区问题


0
投票

看来最简单的解决方案不是尝试理解

pytz.tzinfo
正在做什么,而是转向 Python 3.9 中添加到标准库中的
zoneinfo.ZoneInfo

© www.soinside.com 2019 - 2024. All rights reserved.