Python 我错了还是它错了';这是一只虫子

Python 我错了还是它错了';这是一只虫子,python,timezone,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

这有点奇怪,当我想用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)构建,无论发生什么情况,都会得到正确的结果

有人有主意吗?

说你不能像现在这样使用
datetime.datetime(…,tzinfo)

不幸的是,对于许多时区,使用标准datetime构造函数的tzinfo参数与pytz不兼容

奇怪的是,尽管有种种迹象表明
欧洲/巴黎
时区是错误的,但当您按照它的建议实际使用
本地化
时,它仍然有效:

>>> 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
>tz=pytz.timezone(“欧洲/巴黎”)#使用内置zoneinfo
>>>茨
#什么?皮埃尔和米奎隆时间?
>>>datetime.datetime(2010,1,1,12,0,0,tzinfo=tz)
datetime.datetime(2010,1,1,12,0,tzinfo=)#不好
>>>本地化(datetime.datetime(2010,1,1,12,0,0))
datetime.datetime(2010,1,1,12,0,tzinfo=)#OK
请注意,本地化日期时间的
tzinfo
属性将一个完全不同的对象引用到创建它的
tz
,只共享名称

为什么会发生这种事对我来说是个谜。对于理解多个时区名称的城市文件来说,这似乎是一个问题,但我不知道为什么在调用
本地化
之前无法获取城市的默认时区


(老实说,我从不相信Python的datetime和tzinfo功能。我更喜欢使用int UTC时间戳。)

总体而言,Python的时区功能设计得非常糟糕。“天真”时代的概念是无用的,而且过于复杂;datetime应该只有一种类型,它应该默认为UTC,而不是“未知”(天真)。可能重复@bain,可能是另一种情况:)