【发布时间】:2012-09-30 07:18:37
【问题描述】:
这似乎是错误的:
>>> 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'
>>>
“美国/埃德蒙顿”和“美国/东部”应该是同一时区(标准时间 17:00:00)。更何况 16:26:00 没有任何意义。
-- 更新--
以上内容在 Jon Skeet 的回答中是有意义的。但是,当我这样做时,事情变得很奇怪:
>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)
我创造了一个天真的约会。由于“美国/埃德蒙顿”是我的时区,我尝试手动设置:
>>> 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 小时的偏移量('US/Eastern' 和 'America/Edmonton' 之间的差异)但它给了我 3 小时 26 分钟(即 2 小时加一小时26 分钟 :D)
插入timezone('US/Mountain') 会在astimezone() 中产生正确的结果。使用“America/Edmonton”创建可感知的日期时间也可以正常工作。
【问题讨论】:
-
当你构造
datetime时区开始时会发生什么,而不是使用replace? (看起来这基本上是坏的......) -
然后它工作正常。可悲的是,这不是我的选择,因为天真的日期时间是由另一个我无法控制的函数返回的:(