pytz.timezone('Asia / Chongqing')表现得很奇怪

时间:2013-06-04 11:16:44

标签: python datetime timezone pytz

我正在编写一些Python(Python 2.7.4(默认,2013年4月6日,19:54:46)[MSC v.1500 32位(英特尔)]在win32,Windows 7)代码,需要处理时区。为此,我使用了pytz库(2012d版本),这是安全方面我刚刚使用easy_install更新。

我特别需要在中国四川省成都市表达时间。这是在'亚洲/重庆'时区,应该比'欧洲/伦敦'(这是我当地的时区)早+07:00小时

出于某种原因,当我在'Asia / Chonqing'区域创建一个datetime.datetime时,应用的偏移量是+07:06而不是我预期的+07:00。但是当我在另一个区域(纽约,比如说)中创建一个datetime.datetime时,它可以正常工作。

我认为pytz数据库是正确的,所以我做错了什么?我很感激任何建议。

"""
Fragment of code for messing about with (foreign)
time-zones and datetime/ephem
"""

import datetime
import pytz

ChengduTZ = pytz.timezone('Asia/Chongqing')
ParisTZ   = pytz.timezone('Europe/Paris')
LondonTZ  = pytz.timezone('Europe/London')
NewYorkTZ = pytz.timezone('America/New_York')

MidnightInChengdu = datetime.datetime(2013, 6, 5, 0, 0, 0, 0, ChengduTZ)
MidnightInNewYork = datetime.datetime(2013, 6, 5, 0, 0, 0, 0, NewYorkTZ)

print("When it's midnight in Chengdu it's:")
print(MidnightInChengdu)
print(MidnightInChengdu.astimezone(LondonTZ))
print(MidnightInChengdu.astimezone(ParisTZ))
print(MidnightInChengdu.astimezone(NewYorkTZ))

print("\nWhen it's midnight in New York it's:")
print(MidnightInNewYork)
print(MidnightInNewYork.astimezone(LondonTZ))
print(MidnightInNewYork.astimezone(ParisTZ))
print(MidnightInNewYork.astimezone(ChengduTZ))

产生以下输出:

When it's midnight in Chengdu it's:
2013-06-05 00:00:00+07:06
2013-06-04 17:54:00+01:00
2013-06-04 18:54:00+02:00
2013-06-04 12:54:00-04:00

When it's midnight in New York it's:
2013-06-05 00:00:00-05:00
2013-06-05 06:00:00+01:00
2013-06-05 07:00:00+02:00
2013-06-05 13:00:00+08:00

1 个答案:

答案 0 :(得分:2)

您需要使用.localize()方法将日期时间放入正确的时区,否则会错误地选择历史偏移量:

ChengduTZ = pytz.timezone('Asia/Chongqing')
MidnightInChengdu = ChengduTZ.localize(datetime.datetime(2013, 6, 5, 0, 0, 0, 0))
MidnightInNewYork = NewYorkTZ.localize(datetime.datetime(2013, 6, 5, 0, 0, 0, 0))

请参阅pytz documenation

  

不幸的是,对于许多时区,使用标准日期时间构造函数的'tzinfo参数''与pytz不起作用。

通过此更改,输出变为:

When it's midnight in Chengdu it's:
2013-06-05 00:00:00+08:00
2013-06-04 17:00:00+01:00
2013-06-04 18:00:00+02:00
2013-06-04 12:00:00-04:00

When it's midnight in New York it's:
2013-06-05 00:00:00-04:00
2013-06-05 05:00:00+01:00
2013-06-05 06:00:00+02:00
2013-06-05 12:00:00+08:00

请注意,纽约偏移量也不正确。