PYTZ'美国/埃德蒙顿'错误地抵消了

时间:2012-10-09 21:41:23

标签: python timezone pytz

  

可能重复:
  Weird timezone issue with pytz

这似乎不对:

>>> import pytz
>>> z1 = timezone('America/Edmonton')
>>> z2 = timezone('US/Mountain')
>>> z1
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>
>>> z2
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>
>>> pytz.VERSION
'2012f'
>>> 

'America / Edmonton'和'US / Eastern'应该是同一时区(17:00:00 STD)。更不用说16:26:00没有任何意义。

- 更新 -

以上是Jon Skeet的回答。但是,当我这样做时,事情变得奇怪:

>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)

我创造了一个天真的约会。由于'America / Edmonton' 我的时区,我尝试手动设置:

>>> d2 = d.replace(tzinfo=timezone('America/Edmonton'))
>>> d2
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)

这不应该有任何改变,因为这是正确的TZ。但是:

>>> d2.astimezone(timezone('US/Eastern'))
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

这应该给我一个2小时的偏差('美国/东方'和'美国/埃德蒙顿'之间的差异),但它给我3小时26分钟(这是2小时加上 1小时26分钟:D)

插入timezone('US/Mountain')会在astimezone()中生成正确的结果。使用“America / Edmonton”创建一个有意识的日期时间也可以正常工作。

2 个答案:

答案 0 :(得分:11)

documentation for pytz明确表示直接从时区创建日期时间并不适用于所有情况,并指示您执行以下操作:

d2 = timezone('America/Edmonton').localize(d)

答案 1 :(得分:3)

查看2012c TZDB数据,这是美国/埃德蒙顿的规则集:

Zone America/Edmonton    -7:33:52 -       LMT   1906 Sep
                         -7:00    Edm     M%sT  1987
                         -7:00    Canada  M%sT

我不清楚Python输出试图向你显示偏移量/名称的日期/时间,但是我怀疑它就像1900 - 在这种情况下16:26:00使用-7:33:52的偏移有一定意义,它也会与缩写相匹配。

所以时区数据很好是完全可行的,它只是选择以奇数日期/时间为例。 (对我来说,时区的字符串输出会显示一个时间,说实话......)