Python pytz时区函数返回一个9分钟的时区

时间:2016-02-17 16:53:21

标签: python timezone timezone-offset pytz

由于某些我无法弄清楚的原因,请从以下代码中获取:

>>> 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 pytz,但我承认我还没弄清楚出了什么问题。

我已将其他值传递给timezone()函数,并且它返回的值似乎是正确的。但由于某些原因,与我的时区相关的信息不正确。

最后,我旁边的立方体中的同事确认该函数在他的机器上返回正确的时区信息。

有没有人知道为什么我的时区('America/Chicago')会在9分钟后关闭?我正在运行使用2015.7安装的pytz pip版本。谢谢!

4 个答案:

答案 0 :(得分:9)

基于Carl Meyer在Google Groups Answer

中的答案回答

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

解释是:

  

“pytz时区类不代表与UTC的单一偏移量,它   代表一个在历史进程中具有的地理区域   可能经历了几种不同的UTC偏移。最古老的偏移   对于给定区域,表示时区之前的偏移量   标准化(在19世纪后期,大多数地方)通常被称为“LMT”   (本地平均时间),它经常偏离UTC一个奇数   分“。

(引自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

答案 1 :(得分:4)

仅仅因为我的好奇心并不完全令人满意,我最近又对这个问题进行了一些研究。

最初,差异似乎源于不同版本的pytz。但是,在将我的pytz版本降级到我确认与我的计算机上的结果不同的版本后,我发现这不是问题的根源:即使使用相同版本的pytz我的机器似乎使用基于LMT的UTC偏移,而其他机器使用基于CDT或CST的一个。

根据我与@ J.F.Sebastian的对话,我认为唯一可能的另一种可能性是系统级差异。我稍微挖掘了pytz源代码,发现pytz至少获得部分时区信息的文件位于/usr/share/zoneinfo/。所以我查看了文件/usr/share/zoneinfo/America/Chicago,虽然它是一个二进制文件,但它的一部分是可读的。在文件的中间有一个时区列表:LMTCDTCSTESTCWTCPT。正如您所看到的,LMT是列表中的第一个名称,正如@JFSebastian建议的那样,taht似乎是pytz在我原始问题中描述的情况中使用的那个。

这就是Ubuntu 15.10中列表的样子。但是,在早期版本的Ubuntu(例如,Trusty和Precise)中,我得到结果-600而不是-609结果,同样的列表是CDTCSTESTCWTCPT

我承认这来自于大量的盲目探索和一半的理解,但似乎这是我在机器上看到的差异的原因。至于为什么zoneinfo文件版本不同,以及这些差异对Ubuntu意味着什么,我不知道,但我想我会分享我的发现给那些同样好奇的人,并可能得到深刻的修正/来自社区的补充信息。

答案 2 :(得分:3)

除非您的本地时区具有固定的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版本来解释结果的差异。

答案 3 :(得分:0)

正如您所提到的,原始文件与pytz模块存在一些差异:(在我的情况下使用中央时间)

XXXX ......的lib / python2.7 /站点包/ pytz / zoneinfo中/美/中环

&#13;
&#13;
In [66]: start = start.replace(tzinfo=central)

In [67]: start.isoformat()
Out[67]: '2018-02-26T00:00:00-05:51'
&#13;
&#13;
&#13;

如果您使用操作系统的标准文件(我在mac,ubuntu和centos中测试过)

的/ usr / share / zoneinfo中/ US /中部

&#13;
&#13;
mv xxxx...../lib/python2.7/site-packages/pytz/zoneinfo/US/Central xxxx...../lib/python2.7/site-packages/pytz/zoneinfo/US/Central-bak

ln -s /usr/share/zoneinfo/US/Central xxxx...../lib/python2.7/site-packages/pytz/zoneinfo/US/Central
&#13;
&#13;
&#13;

问题已解决

&#13;
&#13;
In [7]: central = timezone('US/Central')

In [8]: central
Out[8]: <DstTzInfo 'US/Central' CST-1 day, 18:00:00 STD>

In [10]: start = start.replace(tzinfo=central)

In [11]: start.isoformat()
Out[11]: '2018-02-27T00:00:00-06:00'
&#13;
&#13;
&#13;