PYTZ 'America/Edmonton' offset wrong
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Weird timezone issue with pytz
这似乎是错的:
1 2 3 4 5 6 7 8 9 10 | >>> 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'应该是同一时区(STD的17:00:00)。 更不用说16:26:00没有任何意义。
- 更新 -
以上是Jon Skeet的回答。 但是,当我这样做时,事情变得奇怪:
1 2 3 | >>> d = datetime.now() >>> d datetime.datetime(2012, 10, 9, 15, 21, 41, 644706) |
我创造了一个天真的约会。 由于'America / Edmonton'是我的时区,我尝试手动设置:
1 2 3 | >>> 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。 然而:
1 2 | >>> 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)
插入
pytz的文档明确指出,直接从时区创建日期时间并不适用于所有情况,并指示您执行以下操作:
1 | d2 = timezone('America/Edmonton').localize(d) |
查看2012c TZDB数据,这是美国/埃德蒙顿的规则集:
1 2 3 | 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,它也会与缩写相匹配。
所以时区数据很好是完全可行的,它只是选择以奇怪的日期/时间为例。 (对我来说,时区的字符串输出根本不会显示时间,说实话......)