2011-03-10 94 views
63

我有兩個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

回答

3

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

60

試試這個:

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

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

,而不是使用的時候儘量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) 
2

我有類似的情況,你和我結束了使用外部庫調用arrow

這裏是什麼樣子:

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

用途:

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

2

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