我将两个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如何将它们视为平等?
答案 0 :(得分:7)
你的两个时间对象都是天真的&#34;根据{{3}}:
time
对象 t 知道t.tzinfo
不是None
且t.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。
在您的情况下,t1
和t2
都会None
和t1.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}}的方法,并提供了对时间对象进行算术运算的方法。