Я не вижу, в чем проблема, кроме случая, когда время окончания будет позже, чем через 24 часа после времени запуска.
Предположим, что время начала 9:00:00, а время окончания 13: 00: 00
Если бы эти времена были взяты 15 августа, 9:00:00 и 17 августа, 13:00:00, не было бы смысла пытаться получить разницу времени между ними, не зная дней 15 и 17.
Следовательно, есть два случая:
либо время начала и время окончания могут быть действительно разделены более чем на 24 часа, тогда, как уже было сказано, вы должны перейти к использованию объектов datetime
либо между временем начала и временем всегда меньше 24 часов, тогда проблема проста.
==========================
Давайте рассмотрим второй случай.
Если
время начала 11: 30: 00
время окончания .. 12: 35: 00
Конец явно 1 час 5 минут после старта
If
время начала 11: 30: 00
время окончания .. 10: 35: 00
Конец не может быть раньше начала тем же утром, тогда фактически конец наступает утром следующего дня после дня, в который начинается, то есть 24 часа спустя.
Те же рассуждения применимы, когда начало наступает после полудня, а время окончания, по-видимому, раньше времени начала в тот же день, днем или утром: время окончания фактически наступает на следующий день, утром или днем. зависит, но это все еще 24 часа спустя.
1)
Итак, для вычета разницы во времени достаточно маленькой функции, которой нужны только атрибуты времени:
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 = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/60000000
return delt + 1440 if delt<0 else delt
Следующий код предназначен только для лучшего отображения результата:
с даты и времени импорта
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 = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/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))
результат
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)
Чтобы получить длительности в более читаемом формате:
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 = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/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))
результат
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