Art*_*Art 47 python timezone datetime utc pytz
我在pytz的.localize()函数中遇到了一些奇怪的问题.有时它不会调整本地化的日期时间:
.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>)
Run Code Online (Sandbox Code Playgroud)
如您所见,由于本地化/规范化操作,时间没有改变.但是,如果使用.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>)
Run Code Online (Sandbox Code Playgroud)
这似乎调整了日期时间.
问题是 - 这是正确的,为什么其他的错?
Ale*_*lli 41
localize
假设您传递的天真日期时间是"正确"(除了不知道时区!)因此只设置时区,没有其他调整.
您可以(并且建议......)在UTC内部工作(而不是使用天真的日期时间)并replace
在需要以本地化方式执行日期时间的I/O时使用(normalize
将处理DST等).
pao*_*lov 11
localize
是用于创建具有初始固定日期时间值的日期时间感知对象的正确函数.生成的日期时间感知对象将具有原始日期时间值.在我看来,一个非常常见的使用模式,也许pytz可以更好地记录.
replace(tzinfo = ...)
很遗憾地命名.它是一个随机行为的函数.我会建议避免使用此功能来设置时区,除非你喜欢自己造成的痛苦.我已经厌倦了使用这个功能.
小智 10
此 DstTzInfo 类用于与 UTC 的偏移量在某些时间点发生变化的时区。例如(您可能知道),许多地方在夏初转换为“夏令时”,然后在夏末返回“标准时间”。每个 DstTzInfo 实例仅代表这些时区之一,但“localize”和“normalize”方法可帮助您获得正确的实例。
对于阿比让,只有一次过渡(根据 pytz 的说法),那是在 1912 年:
>>> tz = pytz.timezone('Africa/Abidjan')
>>> tz._utc_transition_times
[datetime.datetime(1, 1, 1, 0, 0), datetime.datetime(1912, 1, 1, 0, 16, 8)]
Run Code Online (Sandbox Code Playgroud)
我们从 pytz 中得到的 tz 对象代表 1912 年之前的时区:
>>> tz
<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>
Run Code Online (Sandbox Code Playgroud)
现在查看您的两个示例,看到当您调用 tz.localize(d) 时,您不会将此 1912 年之前的时区添加到您的原始日期时间对象中。它假定您给它的 datetime 对象代表该本地时间的正确时区中的本地时间,即 1912 年后的时区。
但是,在您使用 d.replace(tzinfo=tz) 的第二个示例中,它需要您的 datetime 对象来表示 1912 年之前的时区中的时间。这可能不是你的意思。然后,当您调用 dt.normalize 时,它会将其转换为该日期时间值的正确时区,即 1912 年后的时区。
我意识到我在这方面有点迟了......但这是我发现工作得很好的东西.亚历克斯说:
tz = pytz.timezone('Africa/Abidjan')
now = datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
然后本地化:
tzoffset = tz.utcoffset(now)
mynow = now+tzoffset
Run Code Online (Sandbox Code Playgroud)
而且这种方法可以完美地处理DST