比较两个不同时区的 `time` 对象

7 投票
3 回答
2017 浏览
提问于 2025-04-20 05:53

我正在比较两个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

我会用 (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),并且还提供了对时间对象进行算术运算的方法。

2

关于时间对象的“天真”和“有意识”的说明:

一个时间对象 t 被称为“有意识”,如果 t.tzinfo 不是 None,并且 t.tzinfo.utcoffset(None) 不返回 None。

在你的例子中,t1t2t1.tzinfo.utcoffset(None)t2.tzinfo.utcoffset(None) 都返回了 None。所以你的这两个对象都是“天真”的,没有“意识”。

因此,实际上你是在比较 '01:02:03' 和 '01:02:03',这显然是 True

8

你们的两个时间对象都是“天真的”,根据这个链接的解释:

一个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。这就导致在比较时完全忽略了时区,因为它们实际上没有意义。

撰写回答