有点奇怪的是,当我想要获得欧洲/巴黎时区的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)构造无论如何都会让事情变得正确。
有人有想法吗?
答案 0 :(得分:6)
The docs说你不能像你一样使用datetime.datetime(..., tzinfo)
:
不幸的是,对于许多时区,使用标准日期时间构造函数的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
请注意,本地化日期时间的tzinfo
属性引用与创建它的tz
完全不同的对象,仅共享名称。
对我来说,为什么会这样,这是一个谜。对于了解多个时区名称的城市文件似乎存在问题,但为什么在调用localize
之前没有得到城市的默认时区,我不知道。
(说实话,我从不信任Python的datetime和tzinfo。更喜欢使用int UTC时间戳。)