【问题标题】: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时,结果会有所不同。

谢谢

【问题讨论】:

标签: python timezone pytz


【解决方案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
猜你喜欢
  • 2014-10-05
  • 2018-01-03
  • 2016-02-05
  • 2022-01-09
  • 2015-02-16
  • 2016-11-08
  • 1970-01-01
  • 2015-10-05
  • 2012-08-29
相关资源
最近更新 更多