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

Den*_*gan 23 python timezone pytz

我正在阅读不那么完整的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'
Run Code Online (Sandbox Code Playgroud)

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

有人请给我一个例子(如上所述),结果在不使用时有所不同normalize.

谢谢

Woo*_*ble 10

从pytz文档:

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

  • [确认](https://answers.launchpad.net/pytz/+question/249229):*"在时区之间进行转换时,`.astimezone()`应该就是所有需要的."*即,你不要`.astimezone(tz)`后需要`tz.normalize()`. (5认同)
  • 这句话并没有解释为什么在`.astimezone(tz)`之后你需要`tz.normalize()` (2认同)

Ste*_*lla 6

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

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

所以它用于纠正涉及DST的一些边缘情况.如果您不使用DST时区(例如UTC),则无需使用标准化.

如果您不使用它,在某些情况下,您的转换可能会减少一小时.