今天我遇到了一个有趣的情况。谁能解释为什么ts1和ts2的偏移量不同? ts1是一个日期时间对象,可立即识别时区。 ts2是一个日期时间对象,它从时区开始并且替换了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
答案 0 :(得分:10)
当您致电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
documentation实际上指出,将pytz
与标准日期时间对象的tzinfo
参数一起使用根本不适用于许多时区:
不幸的是使用标准日期时间的tzinfo参数 施工人员&#39;&#39;不工作&#39;&#39;与许多时区的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 documentation指出将datetime.datetime.now()
与tz
arg一起使用相当于:
EST.fromutc(datetime.utcnow().replace(tzinfo=EST))
这意味着您要从UTC转换,这对pytz
是安全的。这就是为什么第一个有效的原因。
答案 1 :(得分:5)
根据documentation,将时区应用于天真日期时间的正确方法是使用localize
方法。
ts1 = eastern.localize(datetime.datetime.now())
此外,我建议您使用避免EST
作为变量名称,因为它通常是&#34;东部标准时间&#34;的标准,而America/New_York
包含&#34;东部标准时间&#34; (EST)和&#34;东部夏令时&#34; (EDT)。