Tôi đã triển khai một lớp TimeRange như bạn có thể thấy bên dưới.
Đầu tiên get_overlapped_range phủ định tất cả các tùy chọn không bị chồng chéo bằng một điều kiện đơn giản, sau đó tính toán phạm vi bị chồng chéo bằng cách xem xét tất cả các tùy chọn có thể.
Để có số ngày, bạn sẽ cần lấy giá trị TimeRange được trả về từ get_overlapped_range và chia thời lượng cho 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]])