出于某种原因,我还没有弄清楚,从下面的代码:
>>> from pytz import timezone
>>> timezone('America/Chicago')
我得到:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>
当,我想,我应该得到:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:00:00 STD>
…因为我不认为我的时区离UTC 6小时9分钟。
我已经看了source code for ^{
我已经将其他值传递给了timezone()
函数,它返回的值似乎是正确的。但由于某些原因,与我的时区相关的信息不正确。
最后,我旁边立方体中的同事已经确认,函数返回了他机器上正确的时区信息。
有人知道为什么我的时区('America/Chicago'
)会在9分钟前关闭吗?我正在运行使用pip
安装的2015.7
版本。谢谢您!
根据Carl Meyer在Google Groups Answer中的回答回答
造成这种差异的原因是,这不是将时区无关的datetime对象转换为时区感知对象的正确方法。
原因是:
(引用Google群组中引用的答案)
基本上,你应该:
out: 2015-06-11 13:30:00-05:00
除非本地时区具有固定的UTC偏移量,否则在不提供特定日期/时间的情况下谈论其特定值是没有意义的。
如果您提供时间,例如当前时间,那么您将看到
pytz
产生预期的UTC偏移:见
如果不提供特定的日期/时间,则
pytz
可以从给定时区的可用utc偏移集返回任意utc偏移。最近的pytz
版本返回与最早时间(通常为LMT)对应的utc偏移量,但您不应依赖它。你和你的朋友可能会使用不同的pytz版本来解释结果的不同。只是因为我的好奇心没有完全满足,我最近对这个问题做了更多的研究。
最初,这种差异似乎源于
pytz
的不同版本。然而,在将我的pytz
版本降级到一个我已经确认我得到了与机器上的结果不同的版本之后,我发现这并不是问题的根源:即使使用相同版本的pytz
我的机器似乎使用基于LMT的UTC偏移量,而其他机器则使用基于CDT或CST的一个。根据我与@J.F.Sebastian的谈话,我认为唯一可能的其他可能性是系统级别的差异。我进一步研究了
pytz
源代码,发现pytz
从中获取至少一些时区信息的文件位于/usr/share/zoneinfo/
。所以我查看了文件/usr/share/zoneinfo/America/Chicago
,虽然它是一个二进制文件,但其中一部分是可读的。文件的中间有一个时区列表:LMTCDTCSTESTCWTCPT
。如您所见,LMT
是列表中的第一个名字,正如@J.F.Sebastian所建议的,taht似乎是pytz
在我最初的问题中描述的情况下使用的名字。这就是Ubuntu 15.10中的列表。然而,在Ubuntu的早期版本(例如,可信和精确的版本)中,我得到的结果是-600而不是-609,相同的列表是
CDTCSTESTCWTCPT
。我承认这来自于很多盲目的探索和半理解,但似乎这就是我在机器上看到的差异的原因。至于为什么不同版本的
zoneinfo
文件不同,以及这些不同对Ubuntu意味着什么,我不知道,但我想我会为那些同样好奇的人分享我的发现,并可能从社区获得有见地的更正/补充信息。相关问题 更多 >
编程相关推荐