Трюк с магией c как таковой отсутствует - но кто-то еще об этом уже подумал, и есть модуль businesstimedelta
, который делает то, что вы хотите, чтобы он делал:
import datetime
import businesstimedelta
workday = businesstimedelta.WorkDayRule(start_time=datetime.time(8),
end_time=datetime.time(16),
working_days=[0,1,2,3,6])
businesshours = businesstimedelta.Rules([workday])
d1 = datetime.datetime(2020,2,3,14,0,0)
d2 = datetime.datetime(2020,2,4,10,0,0)
d3 = datetime.datetime(2020,2,6,14,0,0)
d4 = datetime.datetime(2020,2,9,10,0,0)
print(businesshours.difference(d1,d2))
print(businesshours.difference(d3,d4))
Это определяет рабочая неделя, так что рабочие часы 8-16, а пятница и суббота объявлены выходными. Затем он делает некоторые расчеты. d1 - понедельник, d2 вторник, d3 четверг и d4 воскресенье.
Вы можете настроить рабочие дни, когда у вас sh, 0 будет понедельник и 6 воскресенье.