Pytz Python时区转换无法工作

4

我试图将 "Europe/London" 的pytz时区转换为UTC,但没有成功:

>>>tz=pytz.timezone("Europe/London")
>>>date=datetime.datetime(2015,1,1,4,4)
>>>tz.normalize(tz.localize(date)).astimezone(pytz.utc)
datetime.datetime(2015, 1, 1, 4, 4, tzinfo=<UTC>)
>>>tz.localize(date)
datetime.datetime(2015, 1, 1, 4, 4, tzinfo=<DstTzInfo 'Europe/London'GMT0:00:00 STD>)

这是完全错误的,为什么上面一行是GMT-0,而不是GMT+1。伦敦现在比协调世界时提前一个小时,因为夏令时,但是代码没有体现出这一点。
>>>tz.normalize(tz.localize(date)).astimezone(pytz.utc) #should produce:
datetime.datetime(2015, 1, 1, 3, 4, tzinfo=<UTC>)
1个回答

2

在伦敦的北半球的一月份,你不应该期待夏令时。

pytz-2015.4 版本会产生相同(正确)的结果:

>>> from datetime import datetime
>>> import pytz
>>> d = datetime(2015, 1, 1, 4, 4)
>>> tz = pytz.timezone('Europe/London')
>>> tz.localize(d, is_dst=None).astimezone(pytz.utc)
datetime.datetime(2015, 1, 1, 4, 4, tzinfo=<UTC>)
>>> tz.localize(d, is_dst=None)
datetime.datetime(2015, 1, 1, 4, 4, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>)

我的系统上的zdump也同意这一点:

$ zdump -v Europe/London | grep 2015
Europe/London  Sun Mar 29 00:59:59 2015 UT = Sun Mar 29 00:59:59 2015 GMT isdst=0 gmtoff=0
Europe/London  Sun Mar 29 01:00:00 2015 UT = Sun Mar 29 02:00:00 2015 BST isdst=1 gmtoff=3600
Europe/London  Sun Oct 25 00:59:59 2015 UT = Sun Oct 25 01:59:59 2015 BST isdst=1 gmtoff=3600
Europe/London  Sun Oct 25 01:00:00 2015 UT = Sun Oct 25 01:00:00 2015 GMT isdst=0 gmtoff=0

即直到2015年3月29日,伦敦的协调世界时差为零。

TZ数据库本身也同意:自1996年起,欧洲/伦敦使用欧盟夏令时转换规则:夏令时从三月的最后一个星期日开始


你不应该在北半球的一月份期望夏令时吧?好在现在不是一月份。http://www.timeanddate.com/time/zone/uk/london 显示伦敦现在是GMT+1。显然,pytz Europe/London并没有给出正确的伦敦时间,正如人们可能会想象的那样。 - Evan
2
@Evan:你明白2015年1月1日是在一月份吗? - jfs
哇,那很有道理! - Evan
很棒的解释!谢谢!@jfs - Bright Chang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接