Python中如何获取两个时间对象之间的差异

10

I have two datetime.time objects in Python, e.g.,

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

然而,当我像处理datetime.datetime对象一样处理(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
请注意,@cyber并不处理datetime.time对象(https://dev59.com/6G435IYBdhLWcg3wtSYV的答案可以)。另外,请注意微秒级别的答案并未涉及。 - Foon
1个回答

12

由于 datetime.time 类的对象可能没有定义其 tzinfo 属性,所以它不支持对象相减,就像它不支持对象比较一样。

将时间与时间进行比较,其中在时间轴上 a 在 b 之前时,认为 a 小于 b。如果一个可比较对象是 naive,而另一个是 aware,则会引发 TypeError。如果两个可比较对象都是 aware 的,并且具有相同的 tzinfo 属性,则忽略公共的 tzinfo 属性,比较基本时间。如果两个可比较对象都是 aware 的,并且具有不同的 tzinfo 属性,则首先通过减去它们的 UTC 偏移量(从 self.utcoffset() 获得)来调整这些对象。为了防止混合类型比较回退到默认比较方式(即对象地址),当将时间对象与不同类型的对象进行比较时,除非比较使用 == 或 !=,否则会引发 TypeError。后一种情况分别返回 False 或 True。

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

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

现在,你有了 datetime 对象,可以进行减法运算,它将返回一个 datetime.timedelta 实例。使用方法 total_seconds() 返回秒数(它是一个包含毫秒信息的浮点数)。因此,乘以 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

你也可以使用时间增量:

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

我得到了以下错误:AttributeError: 'module'对象没有属性'combine'。 - Mariska
你还需要导入 datetime,现在检查答案。 - enrico.bacis
我怎样才能以微秒为单位得到答案?我得到了datetime.timedelta(0, 1, 100000)。 - Mariska
timedelta有一个total_seconds()方法,调用它并乘以1000。 - enrico.bacis
我认为硬编码时间差值并没有太大的用处,如果要手动计算,不如使用计算器。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接