使用pytz进行时间转换不准确

2 投票
1 回答
890 浏览
提问于 2025-04-18 05:33

我正在使用 '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 对象上。

撰写回答