24

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

时区之间的转换也需要特别注意。这也需要使用 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,结果是一样的。在我看来,这个例子并没有真正解释为什么我们必须在不同时区的对象normalize之间转换datetime时使用。

有人可以给我一个例子(如上面的例子),当不使用时结果会有所不同normalize

谢谢

4

2 回答 2

12

从 pytz 文档中:

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

于 2009-09-14T17:26:38.220 回答
6

文档说 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。

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

于 2009-09-14T17:27:59.883 回答