pytz:为什么这些不同的方法会给出不同的UTC偏移量?

时间:2011-03-22 10:01:36

标签: python timezone pytz

使用pytz在特定时区创建datetime对象时,根据我是使用datetime.datetime()还是datetime.datetime.now(),我会得到不同的UTC偏移量。

now()似乎为时区提供了正确的UTC偏移量,datetime()给出了一个我无法识别的偏移量。

为什么他们不一样? datetime()分配的偏移的重要性是什么?

这是我的代码:

import datetime
import pytz

la_paz = pytz.timezone('America/La_Paz')

a = datetime.datetime.now(la_paz)
print a, a.utcoffset()

# 2011-03-22 05:30:13-04:00 -1 day, 20:00:00
# -4 hours is the correct UTC offset for La Paz

b = datetime.datetime(2011, 03, 22, 5, 30, tzinfo=la_paz)
print b, b.utcoffset()

# 2011-03-22 05:30:00-04:33 -1 day, 19:27:00
# What is the significance of -4:33?

2 个答案:

答案 0 :(得分:2)

默认情况下,datetime()似乎会使用该区域的第一个记录时区,并且在许多情况下(如在拉巴斯),这是旧的,不再有效。

必须改为创建日期时间,然后进行本地化,如下所示:

b = la_paz.localize(datetime.datetime(2011, 03, 22, 5, 30))
print b, b.utcoffset()

now()似乎会自动进行本地化。

答案 1 :(得分:2)

来自pytz文档:

此库仅支持两种构建本地化时间的方法。第一种是使用pytz库提供的localize()方法。这用于本地化一个天真的日期时间(没有时区信息的日期时间):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print loc_dt.strftime(fmt)
2002-10-27 06:00:00 EST-0500

构建本地化时间的第二种方法是使用标准的astimezone()方法转换现有的本地化时间:

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'

或换句话说:

b = datetime.datetime(2011, 03, 22, 5, 30, tzinfo=la_paz)

pytz不支持