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)
当检查 d
和 t
中的 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)中的奇怪时区行为的主要内容,如果未能解决你的问题,请参考以下文章