在Python中减去两次

我有两个datetime.time值, exitenter ,我想要做的事情如:

 duration = exit - enter 

但是,我得到这个错误:

 TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time 

我如何正确地做到这一点? 一个可能的解决scheme是将timevariables转换为datetime timevariables,然后子结构,但我相信你们必须有一个更好,更干净的方式。

尝试这个:

 from datetime import datetime, date datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter) 

combine构build一个可以减去的date时间。

使用:

 from datetime import datetime, date duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning) 

使用date.min更简洁一些,即使在午夜也是如此。

date.today()可能不是这种情况,如果第一个调用发生在23:59:59,下一个在00:00:00,可能会返回意外的结果。

 import datetime def diff_times_in_seconds(t1, t2): # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1 h1, m1, s1 = t1.hour, t1.minute, t1.second h2, m2, s2 = t2.hour, t2.minute, t2.second t1_secs = s1 + 60 * (m1 + 60*h1) t2_secs = s2 + 60 * (m2 + 60*h2) return( t2_secs - t1_secs) # using it diff_times_in_seconds( datetime.datetime.strptime( "13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime( "14:02:39", '%H:%M:%S').time()) 

datetime.time不支持这个,因为用这种方式减去时间几乎没有意义。 如果你想这样做,请使用完整的datetime.datetime

而不是使用时间尝试timedelta:

 from datetime import timedelta t1 = timedelta(hours=7, minutes=36) t2 = timedelta(hours=11, minutes=32) t3 = timedelta(hours=13, minutes=7) t4 = timedelta(hours=21, minutes=0) arrival = t2 - t1 lunch = (t3 - t2 - timedelta(hours=1)) departure = t4 - t3 print(arrival, lunch, departure) 

我和你有类似的情况,最后我使用了名为箭头的外部库。

这是它的样子:

 >>> import arrow >>> enter = arrow.get('12:30:45', 'HH:mm:ss') >>> exit = arrow.now() >>> duration = exit - enter >>> duration datetime.timedelta(736225, 14377, 757451) 

python timedelta库应该做你需要的。 当您减去两个datetime实例时,将返回timedelta

 import datetime dt_started = datetime.datetime.utcnow() # do some stuff dt_ended = datetime.datetime.utcnow() print((dt_ended - dt_started).total_seconds())