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:为啥在时区之间转换时需要规范化?的主要内容,如果未能解决你的问题,请参考以下文章