比较两个不同时区的 `time` 对象
我正在比较两个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 个回答
我会用 (t1,t1.tzinfo) == (t2, t2.tzinfo)
或者 t1.strftime('%H %M %S %Z') == t2.strftime('%H %M %S %Z')
来检查两个时间是否相等。
derp 解释了 为什么 Python 会把 t1 和 t2 视为相等,并且还提到了这个 支持的操作 (Python 文档)。
更多参考资料:
根据 pytz 文档,
处理时间的推荐方式是始终使用 UTC 时间,只有在生成供人类阅读的输出时才转换为本地时间。
pytz 文档 介绍了如何将 naive time objects
转换为 aware time objects
(使用 localize 和/或 replace),并且还提供了对时间对象进行算术运算的方法。
关于时间对象的“天真”和“有意识”的说明:
一个时间对象 t 被称为“有意识”,如果 t.tzinfo 不是 None,并且 t.tzinfo.utcoffset(None) 不返回 None。
在你的例子中,t1
和 t2
的 t1.tzinfo.utcoffset(None)
和 t2.tzinfo.utcoffset(None)
都返回了 None
。所以你的这两个对象都是“天真”的,没有“意识”。
因此,实际上你是在比较 '01:02:03' 和 '01:02:03',这显然是 True
。
你们的两个时间对象都是“天真的”,根据这个链接的解释:
一个
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#module-datetime
一个“天真的”对象没有足够的信息来明确地确定自己相对于其他日期/时间对象的位置。
换句话说:这些对象没有具体的日期,所以我们无法判断是否适用夏令时。它们是模糊的,运行t.utcoffset()
时会返回None
。这就导致在比较时完全忽略了时区,因为它们实际上没有意义。