python-tz我错了还是个bug

Chm*_*nah 4 python timezone

有点奇怪的是,当我想通过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)
Run Code Online (Sandbox Code Playgroud)

输出是:

2009-01-30 09:00:00 PMT+0009
2009-01-30 09:00:00 CET+0100
Run Code Online (Sandbox Code Playgroud)

当真正的巴黎应该也是CET + 1.

从datetime.datetime.now(tz)构造无论如何都能得到正确的结果.

有人有想法吗?

bob*_*nce 6

文档说你不能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
Run Code Online (Sandbox Code Playgroud)

请注意,tzinfo本地化日期时间的属性引用与tz创建它的完全不同的对象,仅共享名称.

对我来说,为什么会这样,这是一个谜.对于了解多个时区名称的城市文件似乎存在问题,但为什么在你打电话之前没有获得城市的默认时区localize,我不知道.

(老实说,我从来没有信任Python的datetime和tzinfo的东西.更喜欢使用int UTC时间戳.)