你如何在Python中获得两个时间对象之间的差异

Mar*_*ska 4 python datetime

我在Python中有两个datetime.time对象,例如,

>>> x = datetime.time(9,30,30,0)
>>> y = datetime.time(9,30,31,100000)
Run Code Online (Sandbox Code Playgroud)

但是,当我像对datetime.datetime对象那样做(yx)时,我收到以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

我需要以微秒为单位得到yx值,即在这种情况下它应该是1100000.任何想法?

enr*_*cis 8

该类datetime.time不支持对象减法,原因与它不支持对象比较的原因相同,即因为它的对象可能没有定义它们的tzinfo属性:

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

您应该使用datetime.datetime包含日期和时间的内容.

如果两次引用一天,您可以告诉python日期是今天,date.today()并将日期与使用时间相结合datetime.combine.

既然你有日期时间你可以执行减法,这将返回一个datetime.timedelta实例,该实例total_seconds()将返回秒数(它float包含微秒信息).因此乘以10 6即可得到微秒.

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
Run Code Online (Sandbox Code Playgroud)

你也可以使用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
Run Code Online (Sandbox Code Playgroud)