python(pytz)中的奇怪时区行为

Posted

技术标签:

【中文标题】python(pytz)中的奇怪时区行为【英文标题】:Odd timezone behaviour in python (pytz) 【发布时间】:2022-01-03 02:43:50 【问题描述】:

我在 python 中遇到了一个奇怪的时区问题,我将其归结为几行代码:

from datetime import time, datetime
import pytz
tz = pytz.timezone('Canada/Pacific')
d = datetime.now(tz=tz)
t = time(tzinfo=tz)

当检查 dt 中的 tzinfo 对象时,t 中的对象给出了一个 utc-offset 为 8:12 的时区,而 d 中的一个给出了一个 utc-offset 8 小时,这是正确的偏移量。 tz 实例还给出了 8:12 的 UTC 偏移量。额外的 12 分钟有什么用?

我意识到datetime.now() 取决于您运行代码的时间,所以我会说我在将其发布到 *** 之前运行了几分钟并看到了同样的错误。有更多了解时区的人可以帮我找出问题所在吗?

【问题讨论】:

另外,我目前在 PST 时区,住在加拿大温哥华。 datetime.time 的文档说“一个理想化的时间,独立于任何特定的一天,假设每天正好有 24*60*60 秒。(这里没有“闰秒”的概念.)" 也许这很相关?另外,您能否显示minimal reproducible example,其中包括您如何看待时间偏移错误? 我认为这不是正确的方法。如果您看到 pytz 文档,它们会列出不同的用法。 @RandomDavis MRE 在问题文本中:``` from datetime import time, datetime import pytz tz = pytz.timezone('Canada/Pacific') d = datetime.now(tz=tz ) t = time(tzinfo=tz) print(d.tzinfo._utcoffset) print(t.tzinfo._utcoffset) ```为了清楚起见,只是添加了打印语句 如上所述,用法不正确。 【参考方案1】:

@Ruli 答案就是阅读文档。

tz = pytz.timezone('Canada/Pacific')
dt = tz.normalize(datetime.now())
t = tz.normalize(time())

是创建当地时间的正确方法。

【讨论】:

datetime.now(tz) 完全没问题,不需要规范化。 因为说是正确的方式而被否决。提示:不要不要再使用 pytz。 是的。我重新评论是因为@WolfgangKuehn 可能是对的。似乎主要建议使用 zoneinfo 而不是 pytz【参考方案2】:

pytz 确实很奇怪。自 2018 年以来的标准 python 方式是

import datetime
import zoneinfo
ca_pa = zoneinfo.ZoneInfo("Canada/Pacific")
datetime.datetime.now(ca_pa)

不要不要再使用 pytz。

【讨论】:

以上是关于python(pytz)中的奇怪时区行为的主要内容,如果未能解决你的问题,请参考以下文章

时区时间戳怪异

Python中的时区转换

python / pytz问题从本地时区转换为UTC然后返回

使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为

使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为

pytz tzname 的奇怪问题