pytz:在转换时区时为什么需要使用normalize?

26

我正在阅读不太完整的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,结果完全相同。在我看来,这个示例并没有真正解释为什么在不同时区之间转换 datetime 对象时必须使用 normalize

请问是否有人可以给出一个 示例(类似上面的示例),在不使用 normalize 时结果会有所不同。

谢谢


2个回答

12

来自pytz文档:

另外,如果你对跨越夏令时边界的本地时间进行日期计算,结果可能会在一个不正确的时区(例如,从2002年10月27日1:00 EST减去1分钟,得到的是2002年10月27日0:59 EST,而不是正确的2002年10月27日1:59 EDT)。提供了normalize()方法来纠正这个问题。不幸的是,这些问题无法在不修改Python datetime实现的情况下得到解决。


2
这句引语没有解释为什么在调用 .astimezone(tz) 后需要使用 tz.normalize() - jfs
8
确认:在时区转换时,仅需要使用.astimezone()即可。也就是说,在.astimezone(tz)之后,不需要使用tz.normalize() - jfs

6
文档中提到,normalize用作解决夏令时问题的解决方法:
此外,如果您在跨越夏令时边界的本地时间上执行日期运算,则结果可能处于错误的时区(例如,从2002-10-27 1:00 EST减去1分钟,您将得到2002-10-27 0:59 EST而不是正确的2002-10-27 1:59 EDT)。提供了normalize()方法来纠正这个问题。
因此,它用于纠正涉及DST的某些边缘情况。如果您不使用DST时区(例如UTC),则没有必要使用normalize。
如果您不使用它,您的转换在某些情况下可能会少一个小时。

是的,这确实是一个与夏令时有关的问题。 - Alex Martelli
我认为将这描述为边缘情况甚至仅适用于夏令时是完全不准确的。时区本身就非常复杂。各个地方由于包括夏令时和其他政治原因在内的多种原因不断改变其与UTC的偏移量。normalize()函数用于确保正确的偏移量应用于正确的地点和时间。请参见一个人的视频抱怨 - Philip Couling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接