pytz本地化vs datetime rep

2024-10-03 09:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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>)

它似乎在调整日期时间。

问题是-哪个是正确的,为什么其他人错了?


Tags: datetime时间replacetzstdnormalizetzinfoday
3条回答

localize只是假设您传递的原始日期时间是“正确的”(除了不知道时区!)所以只要设定时区,没有其他调整。

当您需要以本地化的方式执行日期时间的I/O时,您可以(而且是明智的……)在UTC内部工作(而不是使用纯日期时间),并使用replacenormalize将处理DST等)。

localize是使用初始固定日期时间值创建日期时间感知对象的正确函数。生成的datetime感知对象将具有原始datetime值。在我看来,这是一种非常常见的使用模式,也许pytz可以更好地记录这种模式。

replace(tzinfo = ...)不幸被命名。它是一个行为随机的函数。我建议不要使用这个函数来设置时区,除非你喜欢自己造成的痛苦。使用这个功能我已经受够了。

我知道我有点晚了。。。 但我发现这是一个很好的方法。 如Alex所述在UTC工作:

tz = pytz.timezone('Africa/Abidjan')
now = datetime.datetime.utcnow()

然后本地化:

tzoffset = tz.utcoffset(now)
mynow = now+tzoffset

这种方法确实能很好地处理DST

相关问题 更多 >