日期时间与时区pytz.不同的偏移量取决于如何设置tzinfo



今天我碰到一个有趣的情况。有人能解释一下为什么ts1和ts2的偏移量不同吗?Ts1是一个datetime对象,它可以立即识别时区。Ts2是一个datetime对象,以timezone-naive开头,并替换了它的tzinfo。然而,它们最终会有不同的偏移量。

>>> from pytz import timezone
>>> EST = timezone('America/New_York')
>>> ts1 = datetime.datetime.now(tz=EST)
>>> ts2 = datetime.datetime.now()
>>> ts2 = ts2.replace(tzinfo=EST)
>>> print ts1
2014-05-16 11:25:16.749748-04:00
>>> print ts2
2014-05-16 11:25:19.581710-05:00

当您调用ts2.replace(tzinfo=EST)时,您获得的tzinfo对象与您使用ts1获得的对象不匹配:

>>> ts1
datetime.datetime(2014, 5, 16, 11, 51, 7, 916090, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
>>> ts2
datetime.datetime(2014, 5, 16, 11, 51, 30, 922692, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)

您最终使用LMT而不是EDT。

pytz文档实际上注意到,使用pytz和标准日期时间对象的tzinfo参数在许多时区根本不起作用:

不幸的是使用了标准日期时间的tzinfo参数构造函数在许多时区对pytz "不起作用"。

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) '2002-10-27 12:00:00 LMT+0020'

对于没有夏令时转换的时区是安全的,例如UTC:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt) '2002-10-27 12:00:00 UTC+0000'

我不太确定为什么第一个工作;也许是因为当对象最初用tzinfo对象构造时,它实际上不需要转换任何东西。

编辑:

啊,Python文档指出,使用datetime.datetime.now()tz参数相当于:

EST.fromutc(datetime.utcnow().replace(tzinfo=EST))

这意味着你从UTC转换,这是安全的pytz。这就是为什么第一个行得通

根据文档,将时区应用于朴素日期时间的正确方法是使用localize方法。

ts1 = eastern.localize(datetime.datetime.now())

另外,我建议您避免使用EST作为变量名,因为它通常是"东部标准时间"的标准,而America/New_York包含"东部标准时间"(EST)和"东部夏令时"(EDT)。

相关内容

  • 没有找到相关文章

最新更新