pytz:为啥在时区之间转换时需要规范化?

Posted

技术标签:

【中文标题】pytz:为啥在时区之间转换时需要规范化?【英文标题】:pytz: Why is normalize needed when converting between timezones?pytz:为什么在时区之间转换时需要规范化? 【发布时间】:2010-11-28 05:11:36 【问题描述】:

我正在阅读不太完整的pytz documentation,但我坚持理解其中的一部分。

时区之间的转换也需要特别注意。这也需要使用 normalize 方法来保证转换正确。

>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 EST+1100'
>>> utc_dt2 = utc.normalize(au_dt.astimezone(utc))
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'

我使用normalize 尝试了这个没有的例子,结果还是一样。在我看来,这个例子并没有真正解释为什么在不同时区的datetime 对象之间进行转换时,我们必须使用normalize

谁能给我一个示例(如上面的示例),当不使用normalize时,结果会有所不同。

谢谢

【问题讨论】:

见Is normalize still needed when converting to local time zones? 【参考方案1】:

来自 pytz 文档:

此外,如果您对跨越 DST 边界的本地时间执行日期算术,则结果可能位于不正确的时区(即,从 2002-10-27 1:00 EST 减去 1 分钟,得到 2002-10- 27 0:59 EST 而不是正确的 2002-10-27 1:59 EDT)。提供了一个 normalize() 方法来纠正这个问题。不幸的是,如果不修改 Python 日期时间实现,就无法解决这些问题。

【讨论】:

这句话并没有解释为什么在.astimezone(tz) 电话之后需要tz.normalize() it is confirmed: "当在时区之间转换时,.astimezone() 应该是所有需要的。" 即,在.astimezone(tz) 之后你不需要tz.normalize() .【参考方案2】:

文档说 normalize 被用作 DST 问题的解决方法:

此外,如果您对跨越 DST 边界的本地时间执行日期算术,则结果可能位于不正确的时区(即,从 2002-10-27 1:00 EST 减去 1 分钟,得到 2002-10- 27 0:59 EST 而不是正确的 2002-10-27 1:59 EDT)。提供了一个 normalize() 方法来纠正这个问题。

所以它被用来纠正一些涉及 DST 的极端情况。如果您没有使用 DST 时区(例如 UTC),则没有必要使用 normalize。

如果您不使用它,在某些情况下,您的转换可能会延迟一小时。

【讨论】:

是的,确实是夏令时相关问题。 我认为将其描述为边缘情况甚至“仅适用于 DST”完全不准确。简单的时区是非常复杂的。由于 DST 和许多其他政治原因等原因,地点不断更改其与 UTC 的偏移量。 normalize() 用于确保将正确的偏移量应用于正确的地点和时间。见one man's video rant

以上是关于pytz:为啥在时区之间转换时需要规范化?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用pytz的Datetime时区转换

Python中两个时区之间的转换[重复]

python / pytz问题从本地时区转换为UTC然后返回

pytz库处理时区转换

Python pytz 时区转换返回的值与不同日期的时区偏移量不同