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

Gor*_*oro 6 python timezone pytz

可能重复:
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'
>>> 
Run Code Online (Sandbox Code Playgroud)

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

- 更新 -

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

>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)
Run Code Online (Sandbox Code Playgroud)

我创造了一个天真的约会.由于'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>)
Run Code Online (Sandbox Code Playgroud)

这不应该有任何改变,因为这是正确的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>)
Run Code Online (Sandbox Code Playgroud)

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

插入timezone('US/Mountain')产生正确的结果astimezone().使用"America/Edmonton"创建感知日期时间也将正常工作.

Mar*_*som 11

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

d2 = timezone('America/Edmonton').localize(d)
Run Code Online (Sandbox Code Playgroud)