使用pytz进行日期时间时区转换

使用pytz进行日期时间时区转换,第1张

使用pytz进行日期时间时区转换

我假设您有以下问题:

为什么第一个功能在UTC时区有效?
为什么’US/Eastern’时区失败(DstTzInfo实例)?
为什么第二个功能对所有提供的示例都有效?
第一个函数不正确,因为它使用

d.replace(tzinfo=dsttzinfo_instance)
代替
dsttzinfo_instance.localize(d)

第二个函数在大多数时间都是正确的,除了在模棱两可或不存在的时间之外,例如在DST转换期间-您可以通过将is_dst参数传递给.localize():(False默认)/ True/ None(引发异常)来更改行为。

第一个函数适用于UTC时区,因为它在任何日期都有固定的utc偏移量(零)。诸如时区之类的其他时区

America/New_York
在不同时间可能会有不同的utc偏移(夏令时,战争时间,某些当地政客可能认为是个好主意的任何时间-可以是任何东西-tz数据库在大多数情况下都有效)。要实现tzinfo.utcoffset(dt),tzinfo.tzname(dt),tzinfo.dst(dt)方法pytz使用的收集DstTzInfo与一组不同的每个实例(_tzname, _utcoffset, _dst)的属性。给定dt(日期/时间)和is_dst,.localize()方法从集合中选择一个适当的实例(在大多数情况下但并非总是如此)DstTzInfo。pytz.timezone(‘America/New_York’)返回一个DstTzInfo实例(_tzname, _utcoffset, _dst)与某个未记录的时间相对应的属性(不同的pytz版本可能返回不同的值-当前版本可能返回tzinfo与zoneinfo可用的最早日期相对应的实例-您在大多数时间都不需要此值:认为选择默认值的动机是突出显示错误(传递pytz.timezone给datetime构造函数或.replace()方法)。

总结一下:.localize()选择适当的

utcoffset
,tzname,dst值,.replace()使用默认(不合适的)值。UTC只有一组utcoffset,tzname,dst,因此可以使用默认值,并且该.replace()方法适用于UTC时区。您需要传递datetime对象和is_dst参数来为其他时区选择适当的值,例如’America/New_York’。

原则上,pytz可以调用localize()方法来实现

utcoffset()
,tzname(),dst()即使方法dt.tzinfo == self:它会及时做出这些方法为O(log n),其中n为间隔的不同(UTCOFFSET,TZNAME,DST)值,但数量datetime的构造和.replace()将作为工作即,则localize()只有通过显式调用才是必需的is_dst。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存