比较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没有给予美国/阿根廷/圣路易斯的答案,但这是可行的:
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
我错过什么了吗?
1条答案
按热度按时间w6lpcovy1#
**编辑:**使用时,下面讨论的差异不再存在
pytz模块警告说,
这个库不同于文档中的用于tzinfo实现的Python API;如果你想创建本地的挂钟时间,你需要使用localize()方法
以及更进一步
这个库只支持两种构建本地化时间的方法,第一种是使用pytz库提供的localize()方法。
另一种方法是使用
astimezone
方法,该方法用于将一个时区识别日期时间转换为另一个时区识别日期时间。为了完全明确,它警告不要使用
tzinfo
参数构造时区感知的日期时间:不幸的是,使用标准datetime构造函数的tzinfo参数“”在很多时区中对pytz不起作用“”。
让我们来验证一下假设
等于
使用此代码:
该代码生成:
所以我的假设是错的:dateutil和pytz返回不同的结果。
哪一个是正确的?我不确定,但是根据this website,目前,
看来皮茨是对的。