我对pytz的.localize()函数有一些奇怪的问题。有时它不会调整本地化的日期时间:
。行为本地化:
>>> tz
<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>
>>> d
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421)
>>> tz.localize(d)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
>>> tz.normalize(tz.localize(d))
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
如您所见,时间并没有因为本地化/规范化操作而改变。 但是,如果使用.replace:
>>> d.replace(tzinfo=tz)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>)
>>> tz.normalize(d.replace(tzinfo=tz))
datetime.datetime(2009, 9, 2, 15, 1, 42, 91421,
tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
它似乎在调整日期时间。
问题是-哪个是正确的,为什么其他人错了?
localize
只是假设您传递的原始日期时间是“正确的”(除了不知道时区!)所以只要设定时区,没有其他调整。当您需要以本地化的方式执行日期时间的I/O时,您可以(而且是明智的……)在UTC内部工作(而不是使用纯日期时间),并使用
replace
(normalize
将处理DST等)。localize
是使用初始固定日期时间值创建日期时间感知对象的正确函数。生成的datetime感知对象将具有原始datetime值。在我看来,这是一种非常常见的使用模式,也许pytz可以更好地记录这种模式。replace(tzinfo = ...)
不幸被命名。它是一个行为随机的函数。我建议不要使用这个函数来设置时区,除非你喜欢自己造成的痛苦。使用这个功能我已经受够了。我知道我有点晚了。。。 但我发现这是一个很好的方法。 如Alex所述在UTC工作:
然后本地化:
这种方法确实能很好地处理DST
相关问题 更多 >
编程相关推荐