如何在Python中获取两个时间对象的差值

10 投票
1 回答
10394 浏览
提问于 2025-04-18 16:59

我在Python中有两个时间对象,比如:

>>> x = datetime.time(9,30,30,0)
>>> y = datetime.time(9,30,31,100000)

但是,当我像处理日期时间对象那样做(y-x)时,出现了以下错误:

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    y-x
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

我需要得到y-x的值,单位是微秒,也就是在这个例子中应该是1100000。有什么想法吗?

1 个回答

12

datetime.time 不支持对象之间的减法,原因和它不支持对象比较是一样的。也就是说,它的对象可能没有定义 tzinfo 属性。

时间和时间之间的比较是这样的:如果 a 早于 b,那么 a 被认为小于 b。如果一个时间是“天真”的(naive),另一个是“有意识”的(aware),就会出现类型错误(TypeError)。如果两个时间都是“有意识”的,并且它们的 tzinfo 属性相同,那么会忽略这个共同的 tzinfo 属性,直接比较基础时间。如果两个时间都是“有意识”的,但它们的 tzinfo 属性不同,首先会通过减去它们的 UTC 偏移量(可以通过 self.utcoffset() 获取)来调整它们。为了避免不同类型的比较回退到默认的对象地址比较,当一个时间对象与不同类型的对象比较时,除非比较是 == 或 !=,否则会引发类型错误。后者的情况会返回 False 或 True。

你应该使用 datetime.datetime,它同时包含日期和时间。

如果这两个时间指的是同一天,你可以告诉 Python 今天的日期,使用 date.today(),然后用 datetime.combine 将日期和时间结合起来。

现在你有了日期时间,你可以进行减法,这会返回一个 datetime.timedelta 实例。这个实例有一个方法 total_seconds(),可以返回秒数(这是一个包含微秒信息的 float)。所以你可以乘以 106 来得到微秒数。

from datetime import datetime, date, time

x = time(9, 30, 30, 0)
y = time(9, 30, 31, 100000)

diff = datetime.combine(date.today(), y) - datetime.combine(date.today(), x)
print diff.total_seconds() * (10 ** 6)        # 1100000.0

你也可以直接使用时间差(timedeltas):

from datetime import timedelta
x = timedelta(hours=9, minutes=30, seconds=30)
y = timedelta(hours=9, minutes=30, seconds=31, microseconds=100000)
print (y - x).total_seconds() * (10 ** 6)     # 1100000.0

撰写回答