I have two
enter and I want to do something like:
duration = exit - enter
However, I get this error:
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time
How do I do this correctly? One possible solution is converting the
time variables to
datetime variables and then subtruct, but I’m sure you guys must have a better and cleaner way.
from datetime import datetime, date datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)
combine builds a datetime, that can be subtracted.
from datetime import datetime, date duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)
date.min is a bit more concise and works even at midnight.
This might not be the case with
date.today() that might return unexpected results if the first call happens at 23:59:59 and the next one at 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 does not support this, because it’s nigh meaningless to subtract times in this manner. Use a full
datetime.datetime if you want to do this.
instead of using time try 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)
I had similar situation as you and I ended up with using external library called arrow.
Here is what it looks like:
>>> import arrow >>> enter = arrow.get('12:30:45', 'HH:mm:ss') >>> exit = arrow.now() >>> duration = exit - enter >>> duration datetime.timedelta(736225, 14377, 757451)
The python timedelta library should do what you need. A
timedelta is returned when you subtract two
import datetime dt_started = datetime.datetime.utcnow() # do some stuff dt_ended = datetime.datetime.utcnow() print((dt_ended - dt_started).total_seconds())