Я реализовал класс TimeRange, как вы можете видеть ниже.
get_overlapped_range сначала отменяет все неперекрывающиеся опции простым условием, а затем вычисляет перекрывающийся диапазон, рассматривая все возможные опции.
чтобы получить количество дней, в течение которых вам нужно взять значение TimeRange, которое было возвращено из get_overlapped_range, и разделить длительность на 60 * 60 * 24 (:
class TimeRange (object):
def __init__(self, start, end):
self.start = start
self.end = end
self.duration = self.end - self.start
def is_overlapped(self, time_range):
if max(self.start, time_range.start) < min(self.end, time_range.end):
return True
else:
return False
def get_overlapped_range(self, time_range):
if not self.is_overlapped(time_range):
return
if time_range.start >= self.start:
if self.end >= time_range.end:
return TimeRange(time_range.start, time_range.end)
else:
return TimeRange(time_range.start, self.end)
elif time_range.start < self.start:
if time_range.end >= self.end:
return TimeRange(self.start, self.end)
else:
return TimeRange(self.start, time_range.end)
def __repr__(self):
return '{0} ------> {1}'.format(*[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(d))
for d in [self.start, self.end]])