奇怪的.astimezone行为

时间:2013-12-27 17:14:36

标签: python pytz

我正在做一些时区转换,我得到了非常奇怪的结果。基本上只在整个小时不同的时区之间进行转换,我仍然得到非完整的结果。例如:

from datetime import datetime
from pytz import timezone

datetime(2013, 12, 27, 20, 0, 0, tzinfo=timezone('Europe/Bucharest'))\
    .astimezone(timezone('Europe/Berlin')).replace(tzinfo=None)

给了我

datetime.datetime(2013, 12, 27, 19, 16)

(布加勒斯特和柏林之间的时差是1小时,所以我应该得到19:00 - 而不是19:16)

我可能错过了一些非常明显的东西,但我无法弄清楚。我做错了什么?

2 个答案:

答案 0 :(得分:9)

pytz documentation指定:

  

不幸的是,对于许多时区,使用标准日期时间构造函数的'tzinfo参数''与pytz不起作用。

确实,这不是预期的结果,时区是错误的:

>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=timezone('Europe/Bucharest'))
datetime.datetime(2013, 12, 27, 20, 0,
    tzinfo=<DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD>)

这解释了pytz构造函数,timezone('Europe/Bucharest')时区在时应该考虑时不检查,这些事情往往会随着时间而改变。 pytz只使用早先已知的定义,这通常是错误的:

>>> timezone('Europe/Bucharest')
<DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD>

看起来这个时区使用了until 1931

使用UTC时间并使用astimezone转换时,没有此类问题(仅出于推荐目的显示):

>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc)\
    .astimezone(timezone('Europe/Bucharest')) 
datetime.datetime(2013, 12, 27, 22, 0,
    tzinfo=<DstTzInfo 'Europe/Bucharest' EET+2:00:00 STD>)

然后你得到预期的结果:

>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc)\
    .astimezone(timezone('Europe/Bucharest'))\
    .astimezone(timezone('Europe/Berlin'))\
    .replace(tzinfo=None)
datetime.datetime(2013, 12, 27, 21, 0)

答案 1 :(得分:1)

我今天遇到了同样的问题,并最终使用当前接受的答案的评论中的@jfs答案来解决它。为了帮助其他人在将来找到这个,这里有一个简单的例子说明了什么做了什么,什么不起作用:

from datetime import datetime
import pytz

naive = datetime.now()
la_tz = pytz.timezone("America/Los_Angeles")

# this doesn't work
with_tz = naive.replace(tzinfo=la_tz)
converted_to_utc = with_tz.astimezone(pytz.utc)
print(converted_to_utc)

# this does work
with_tz = la_tz.localize(naive)
converted_to_utc = with_tz.astimezone(pytz.utc)
print(converted_to_utc)