具有不同时区的两个“时间”对象的比较

时间:2014-09-07 02:20:16

标签: python python-2.7 datetime time pytz

我将两个time对象与不同的时区进行比较,看起来它实际上忽略了时区,只测试了小时/分钟/秒组件。

让我们创建两个time个对象:

from datetime import time
import pytz

CET = pytz.timezone('CET')
Japan = pytz.timezone('Japan')

t1 = time(1,2,3, tzinfo=CET)
t2 = time(1,2,3, tzinfo=Japan)

打印它们,我们发现它们非常不同:

datetime.time(1, 2, 3, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)
datetime.time(1, 2, 3, tzinfo=<DstTzInfo 'Japan' JST+9:00:00 STD>)

现在,让我们对它们进行比较:

t1 == t2
#-> True
嗯,什么? Python如何将它们视为平等?

3 个答案:

答案 0 :(得分:7)

你的两个时间对象都是天真的&#34;根据{{​​3}}:

  

time对象 t 知道t.tzinfo不是Nonet.tzinfo.utcoffset(None)没有返回None。否则, t 是天真的。

print(t1.tzinfo, t1.tzinfo.utcoffset(None))
print(t2.tzinfo, t2.tzinfo.utcoffset(None))

给我们:

(<DstTzInfo 'CET' CET+1:00:00 STD>, None)
(<DstTzInfo 'Japan' JST+9:00:00 STD>, None)

https://docs.python.org/2/library/datetime.html#datetime.tzinfo

  

天真物体不包含足够的信息,无法明确地相对于其他日期/时间对象定位自己。


换句话说:对象没有日期,因此无法确定夏令时是否适用。它们不明确,并且运行t.utcoffset()会返回None。这使得时区在比较中完全被忽略,因为它们实际上毫无意义。

答案 1 :(得分:2)

关于天真和知觉时间对象的文档:

  

时间对象t知道t.tzinfo是否为None且t.tzinfo.utcoffset(None)不返回None。

在您的情况下,t1t2都会Nonet1.tzinfo.utcoffset(None)返回t2.tzinfo.utcoffset(None)。因此,你的对象是天真的,不知道。

如此有效地将'01:02:03'与'01:02:03'进行比较,即True

答案 2 :(得分:0)

我会使用(t1,t1.tzinfo) == (t2, t2.tzinfo)t1.strftime('%H %M %S %Z') == t2.strftime('%H %M %S %Z')来检查相等性。

derp explained为什么Python将t1和t2视为相等并且也引用此supported operations (Python docs)

更多参考资料

根据pytz docs

  

处理时间的首选方法是始终使用UTC,   仅在生成要读取的输出时转换为本地时间   人类。

pytz docs显示了将naive time objects转换为aware time objects到{{1}}的方法,并提供了对时间对象进行算术运算的方法。