我在使用dateutil
和pytz
比较输出时遇到了问题。我正在创建一个意识到时区的日期时间对象(UTC),然后将其转换为给定的时区,但是我得到了不同的答案。我怀疑dateutil有时会给出错误的结果,因为它在考虑夏令时时存在问题(至少我读到了一条评论),但我找不到确认或解决该问题的方法。这是代码:
import dateutil
u = dateutil.tz.tzutc()
date1 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u)
# 2010-05-02 11:10:00+00:00
u2 = dateutil.tz.gettz('America/Chicago')
date2 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u2)
# 2010-05-02 11:10:00-05:00
import pytz
u = pytz.timezone('UTC')
date1 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u)
# 2010-05-02 11:10:00+00:00
u2 = pytz.timezone('America/Chicago')
date2 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u2)
# 2010-05-02 11:10:00-06:00
那么,这里可能出了什么问题呢?
更新:
我刚刚尝试了这个:
print u2.normalize(date1.astimezone(u2))
# 2010-05-02 06:10:00-05:00
所以pytz需要使用normalize
来考虑DST吗?
更新2:
似乎pytz和dateutil不能为America/Argentina/San_Luis提供答案,但是这个方法可以:
import pytz, dateutil, datetime
now = datetime.datetime.now()
for zone in pytz.all_timezones:
utc_dateutil = dateutil.tz.tzutc()
utcdate_dateutil = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, tzinfo=utc_dateutil)
zone_dateutil = dateutil.tz.gettz(zone)
newzone_dateutil = utcdate_dateutil.astimezone(zone_dateutil)
utc_pytz = pytz.timezone('UTC')
utcdate_pytz = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, tzinfo=utc_pytz)
zone_pytz = pytz.timezone(zone)
newzone_pytz = utcdate_pytz.astimezone(zone_pytz)
assert newzone_dateutil == newzone_pytz
我有什么遗漏吗?
America / Chicago
时区出现了一些问题?在另一台机器上尝试一下?我无法复制这种行为。 - Celadalocalize
,那么pytz
在应用时会变得非常愚蠢。它只是使用数据库中该时区的第一个内容,而在某些情况下这完全是无意义的 - 参见https://dev59.com/ZWgu5IYBdhLWcg3wRlL0。它肯定*不会*考虑夏令时。 - Mark Ransom