Python pytz timezone函数返回一个关闭了9分钟的时区

2024-10-03 09:11:20 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,我还没有弄清楚,从下面的代码:

>>> 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版本。谢谢您!


Tags: 函数代码fromimport信息utcstdtimezone
3条回答

根据Carl Meyer在Google Groups Answer中的回答回答

造成这种差异的原因是,这不是将时区无关的datetime对象转换为时区感知对象的正确方法。

原因是:

"A pytz timezone class does not represent a single offset from UTC, it represents a geographical area which, over the course of history, has probably gone through several different UTC offsets. The oldest offset for a given zone, representing the offset from before time zones were standardized (in the late 1800s, most places) is usually called "LMT" (Local Mean Time), and it is often offset from UTC by an odd number of minutes."

(引用Google群组中引用的答案)

基本上,你应该:

from datetime import datetime
import pytz

my_datetime = datetime(2015, 6, 11, 13, 30)
my_tz = pytz.timezone('America/Chicago')    
good_dt = my_tz.localize(my_datetime)

print(good_dt)

out: 2015-06-11 13:30:00-05:00

除非本地时区具有固定的UTC偏移量,否则在不提供特定日期/时间的情况下谈论其特定值是没有意义的。

如果您提供时间,例如当前时间,那么您将看到pytz产生预期的UTC偏移:

>>> from datetime import datetime
>>> import pytz
>>> datetime.now(pytz.timezone('America/Chicago')).strftime('%Z%z')
'CST-0600'

如果不提供特定的日期/时间,则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意味着什么,我不知道,但我想我会为那些同样好奇的人分享我的发现,并可能从社区获得有见地的更正/补充信息。

相关问题 更多 >