如何在Python中获取两个时间对象的差值
我在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 个回答
类 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