2009-09-14 19 views
18

我读的不是很完整的pytz documentation,我坚持了解它的一部分。pytz:为什么在时区之间转换时需要标准化?

在时区之间转换也需要特别注意。这也需要使用标准化方法来确保转换是正确的。

>>> 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时结果不同。

感谢

+0

请参见[转换为本地时区时是否仍然需要正常化?](https://answers.launchpad.net/pytz/+question/249229) – jfs 2015-08-23 08:23:03

回答

8

从pytz文档:

此外,如果执行本地时间跨越DST边界日期计算,其结果可能是不正确的时区(即减去1分钟。 2002-10-27美国东部标准时间,你得到2002-10-27 0:59美国东部时间,而不是正确的2002-10-27 1:59 EDT)。提供了一个normalize()方法来纠正这个问题。不幸的是,这些问题不能在不修改Python日期时间实现的情况下解决。

+2

此引用不能解释为什么您需要'tz.normalize ()''.astimezone(tz)''后调用 – jfs 2015-08-23 08:22:11

+4

[已确认](https://answers.launchpad.net/pytz/+question/249229):*“当在时区之间转换时,'.astimezone()'应该是所有需要的。“*即,'.astimezone(tz)'后面不需要'tz.normalize()'。 – jfs 2016-04-22 20:42:16

6

的文档说正常化用作DST问题的解决方法:

此外,如果执行本地时间跨越DST边界日期计算,其结果可能是不正确的时区(即从2002-10-27美国东部时间减去1分钟,而美国东部标准时间2002-10-27 0:59而不是2002-10-27 1:59 EDT)。提供了一个normalize()方法来纠正这个问题。

因此它被用来纠正一些涉及DST的边缘案例。如果您不使用DST时区(例如UTC),则不需要使用标准化。

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

+0

是的,这确实是一个与DST相关的问题。 – 2009-09-14 18:28:46

相关问题