减去蟒蛇两次

问题描述:

我有两个datetime.time值,exitenter,我想要做的事,如:减去蟒蛇两次

duration = exit - enter 

不过,我得到这个错误:

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

我怎样做这是否正确?一种可能的解决方案是将变量time变量转换为datetime变量,然后子结构,但我相信你们必须有一个更好,更清洁的方式。

+1

我非常希望upvote这个回答的问题,但我不会直到答案被接受。 – raratiru 2017-11-12 14:58:10

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

+35

如果你从你的域名知道两个'datetime.time'对象'a'和'b'来自同一天,那'b> a',那么操作'b - a'就具有完美的含义。 – swalog 2014-02-05 13:51:19

+2

即使他们不是同一天,它仍然很有道理。至少和'arctan(0)=(0,pi,2pi,...)'一样有意义,但我们不关心第一个之后的任何值。所以,'4:00 - 20:00'是'8:00' - 它也是('32:00','56:00',...),但是谁在乎? – naught101 2015-03-10 23:34:23

+0

[除非是其中一种情况。](https://www.youtube.com/watch?v=-5wpm-gesOY) – 2015-03-11 09:35:53

试试这个:

from datetime import datetime, date 

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

combine建立一个日期,可以扣除。

+20

希望它不会跨越午夜...... – 2011-03-10 13:02:56

+2

对@ IgnacioVazquez-Abrams来说,可以使用'datetime(1,1,1,0,0,0)'而不是'date.today()' 。 – Akavall 2014-03-07 18:54:33

+12

不要命名'datetime''exit',因为'exit'是一个内置函数。 – orokusaki 2015-09-30 03:28:26

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

,而不是使用的时候尽量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) 

我有类似的情况,你和我结束了使用外部库调用arrow

这里是什么样子:

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

用途:

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,可能会返回意外的结果。

+1

同意你的意见。 – ramwin 2017-03-22 05:52:40

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