在python中减去两次

时间:2011-03-10 12:55:48

标签: python datetime

我有两个datetime.timeexitenter,我想做类似的事情:

duration = exit - enter

然而,我收到此错误:

  

TypeError:不支持的操作数类型 - :'datetime.time'和   “datetime.time

我该如何正确地做到这一点?一种可能的解决方案是将time变量转换为datetime变量然后再进行子结构,但我相信你们必须有更好更清洁的方法。

10 个答案:

答案 0 :(得分:74)

试试这个:

from datetime import datetime, date

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

combine建立一个可以减去的日期时间。

答案 1 :(得分:35)

使用:

from datetime import datetime, date

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

使用date.min更加简洁,即使在午夜也可以使用。

如果第一次调用发生在23:59:59而下一次调用发生在00:00:00,则date.today()可能不会出现意外结果。

答案 2 :(得分:14)

而不是使用时间尝试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)

答案 3 :(得分:5)

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

答案 4 :(得分:5)

python timedelta库应该可以满足您的需求。当你减去两个File -> Project Structure -> Module -> Your Module -> target/generated-sources/delombok个实例时会返回Excluded

timedelta

答案 5 :(得分:4)

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())

答案 6 :(得分:3)

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

这是它的样子:

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

答案 7 :(得分:2)

您有两个datetime.time对象,因此您只需使用datetime.timedetla创建两个timedelta,然后使用“ - ”操作数立即减去。以下是在不使用datetime的情况下减去两次的示例方法。

enter = datetime.time(hour=1)  # Example enter time
exit = datetime.time(hour=2)  # Example start time
enter_delta = datetime.timedelta(hours=enter.hour, minutes=enter.minute, seconds=enter.second)
exit_delta = datetime.timedelta(hours=exit.hour, minutes=exit.minute, seconds=exit.second)
difference_delta = exit_delta - enter_delta

difference_delta 是您可以出于原因使用的差异。

答案 8 :(得分:0)

datetime.time无法做到-但是您可以使用datetime.datetime.now()

start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start

答案 9 :(得分:0)

timedelta 接受负 (-) 时间值。所以它可以简单如下(单行)

duration = datetime.timedelta(hours=exit.hour-enter.hour, minutes=exit.minute-enter.minute)

运行测试

import datetime

enter = datetime.time(hour=1, minute=30)
exit = datetime.time(hour=2, minute=0)
duration = datetime.timedelta(hours=exit.hour-enter.hour, minutes=exit.minute-enter.minute)

>>> duration
datetime.timedelta(seconds=1800)