python-tz 是我错了吗还是个bug
看起来有点奇怪,当我想用pytz获取欧洲/巴黎的时区时,它给我的是PMT时区,而不是GMT+1,感觉在欧洲/柏林时却能正常工作。
不明白?那看看这个代码片段:
#!/usr/bin/python
import os
import datetime
from pytz.tzfile import build_tzinfo
base='/usr/share/zoneinfo/'
tz = build_tzinfo('Europe/Paris',
open(os.path.join(base,'Europe','Paris'), 'rb'))
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)
tz = build_tzinfo('Europe/Berlin',
open(os.path.join(base,'Europe','Berlin'), 'rb'))
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)
输出结果是:
2009-01-30 09:00:00 PMT+0009
2009-01-30 09:00:00 CET+0100
其实巴黎的时区应该也是CET+1。
如果用datetime.datetime.now(tz)来构造的话,不管怎样都能正确获取时区。
有人知道这是怎么回事吗?
1 个回答
6
文档上说,你不能像这样使用 datetime.datetime(..., tzinfo)
:
不幸的是,使用标准 datetime 构造函数的 tzinfo 参数在很多时区下与 pytz 不兼容,这并不管用。
有趣的是,尽管所有迹象表明 Europe/Paris
时区是错的,但当你按照推荐使用 localize
时,它却能正常工作:
>>> tz= pytz.timezone('Europe/Paris') # using built-in zoneinfo
>>> tz
<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD> # what? Pierre et Miquelon Time?
>>> datetime.datetime(2010,1,1,12,0,0, tzinfo=tz)
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>) # bad
>>> tz.localize(datetime.datetime(2010,1,1,12,0,0))
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>) # OK
请注意,经过本地化处理的 datetime 的 tzinfo
属性引用的是一个完全不同的对象,而不是它创建时用的 tz
,它们只共享名称。
我不明白为什么会这样。这似乎是与理解多个时区名称的城市文件有关,但为什么在你调用 localize
之前,城市的默认时区不会出现,我就不知道了。
(说实话,我从来不太信任 Python 的 datetime 和 tzinfo 相关的东西。我更喜欢使用整数形式的 UTC 时间戳。)