使用pytz进行时间转换不准确
我正在使用 '2014.2'
版本的 pytz
。我想把 Asia/Kuwait
的当地时间转换成 UTC
时间,使用的过程如下:
>>> from_date = "2014/05/06 17:07"
>>> from_date = dateutil.parser.parse(from_date)
>>> utc=timezone('UTC')
>>> from_date = from_date.replace(tzinfo=timezone('Asia/Kuwait')).astimezone(utc)
>>> from_date
datetime.datetime(2014, 5, 6, 13, 55, tzinfo=<UTC>)
>>> from_date.strftime("%b %d %Y %H:%M:%S" )
'May 06 2014 13:55:00'
我查到的实际 UTC
时间是 2014年5月6日 14:06:00
,这个信息我在这里找到的:http://www.worldtimeserver.com/current_time_in_UTC.aspx。但是为什么 pytz
转换出来的时间和实际时间不完全一致呢?可以看到,两者之间有 10-11分钟
的时间差。
1 个回答
9
不要用 datetime.replace()
来处理 pytz
时区。根据 pytz
的文档:
不幸的是,标准的 datetime 构造函数中的 tzinfo 参数在很多时区下与 pytz 是“无法正常工作的”。
之所以无法正常工作,是因为 pytz
的时区包含了历史数据,而 datetime
并不能处理这些数据。
建议使用专门的 timezone.localize()
方法:
>>> import dateutil.parser
>>> from pytz import timezone
>>> from_date = "2014/05/06 17:07"
>>> from_date = dateutil.parser.parse(from_date)
>>> from_date = timezone('Asia/Kuwait').localize(from_date).astimezone(timezone('UTC'))
>>> from_date
datetime.datetime(2014, 5, 6, 14, 7, tzinfo=<UTC>)
>>> from_date.strftime("%b %d %Y %H:%M:%S" )
'May 06 2014 14:07:00'
timezone.localize()
方法可以正确地将时区应用到一个没有时区信息的 datetime
对象上。