I don’t see where the problem is, except when the end time is later than 24 hours after the start.
Suppose the start time is 9:00:00 and the end time is 13:00:00
If these times were made on August 15, 9:00:00 and August 17, 13:00:00, there would be no point in trying to get a temporary delta between them, not knowing days 15 and 17.
Therefore, there are two cases:
the start and end time can really be divided by more than 24 hours, then, as already mentioned, you should move on to using datetime objects
or between the start time and the end time is always less than 24 hours, then the problem is simple.
============================
Consider the second case.
If a
start time 11:30:00
end of time. 12:35:00
The end, apparently, is 1 hour 5 minutes after the start
If a
start time 11:30:00
end of time. 10:35:00
The end cannot be before the start on the same morning, then the end actually occurs on the morning of the next day after the day on which it begins, that is, after 24 hours.
The same reasoning applies when the beginning begins in the afternoon, and the end time seems to be before the time starts on the same day, day or morning: the end time is actually on the next day, morning or afternoon, this depends, but he is still 24 hours later.
one)
Thus, in order to subtract the time difference, a little function is enough, for which only time attributes are required:
def difft(start,end): a,b,c,d = start.hour, start.minute, start.second, start.microsecond w,x,y,z = end.hour, end.minute, end.second, end.microsecond delt = (wa)*60 + (xb) + (yc)/60. + (zd)/60000000 return delt + 1440 if delt<0 else delt
The following code is intended only to better display the result:
from datetime import time
def difft(start,end): a,b,c,d = start.hour, start.minute, start.second, start.microsecond w,x,y,z = end.hour, end.minute, end.second, end.microsecond delt = (wa)*60 + (xb) + (yc)/60. + (zd)/60000000 D = '%sh %smn %ss %sms - %sh %smn %ss %sms == ' ft = '%s + 1440 = %s (1440 = 24x60mn)' return D % (w,x,y,z,a,b,c,d) +( ft % (delt, delt+1440) if delt<0 else str(delt)) print difft(time(11,30,0),time(12,35,0)) print difft(time(11,30,0),time(10,35,0)) print print difft(time(20,40,0),time(22,41,0)) print difft(time(20,40,0),time(18,41,0))
result
12h 35mn 0s 0ms - 11h 30mn 0s 0ms == 65.0 10h 35mn 0s 0ms - 11h 30mn 0s 0ms == -55.0 + 1440 = 1385.0 (1440 = 24x60mn) 22h 41mn 0s 0ms - 20h 40mn 0s 0ms == 121.0 18h 41mn 0s 0ms - 20h 40mn 0s 0ms == -119.0 + 1440 = 1321.0 (1440 = 24x60mn)
2)
To get the duration in a more readable format:
def difft2(start,end): a,b,c,d = start.hour, start.minute, start.second, start.microsecond w,x,y,z = end.hour, end.minute, end.second, end.microsecond delt = (wa)*60 + (xb) + (yc)/60. + (zd)/60000000. if delt < 0: delt += 1440 hh,rem = divmod(delt,60) hh = int(hh) mm = int(rem) rem = (rem - mm)*60 ss = int(rem) ms = (rem - ss)*1000000 ms = int(ms) SS = '%sh %smn %ss %sms - %sh %smn %ss %sms == %sh %smn %ss %sms' return SS % (w,x,y,z,a,b,c,d,hh,mm,ss,ms) print difft2(time(11,30,0),time(12,35,45,478129)) print difft2(time(11,30,45,11),time(10,35,45,12)) print print difft2(time(20,40,0),time(22,41,0)) print difft2(time(20,40,0),time(18,41,0))
result
12h 35mn 45s 478129ms - 11h 30mn 0s 0ms == 1h 5mn 45s 478128ms 10h 35mn 45s 12ms - 11h 30mn 45s 11ms == 23h 5mn 0s 1ms 22h 41mn 0s 0ms - 20h 40mn 0s 0ms == 2h 1mn 0s 0ms 18h 41mn 0s 0ms - 20h 40mn 0s 0ms == 22h 1mn 0s 0ms