from datetime import datetime, timedelta
def calculate_union_hours(time_ranges):
# 将时间段按开始时间排序
sorted_ranges = sorted(time_ranges, key=lambda x: x[0])
# 合并重叠或相邻的时间段
merged_ranges = []
for start, end in sorted_ranges:
if not merged_ranges or start > merged_ranges[-1][1]:
merged_ranges.append((start, end))
else:
merged_ranges[-1] = (merged_ranges[-1][0], max(merged_ranges[-1][1], end))
# 计算总时长
total_hours = 0
for start, end in merged_ranges:
total_hours += (end - start).total_seconds() / 3600 # 秒转小时
return total_hours
# 示例时间段(使用 datetime 对象)
time_ranges1 = [
(datetime(2024, 12, 6, 23, 0), datetime(2024, 12, 7, 2, 0)),
(datetime(2024, 12, 7, 1, 0), datetime(2024, 12, 7, 3, 0)),
]
time_ranges2 = [
(datetime(2024, 12, 6, 9, 0), datetime(2024, 12, 6, 10, 0)),
(datetime(2024, 12, 6, 15, 0), datetime(2024, 12, 6, 17, 0)),
(datetime(2024, 12, 6, 9, 30), datetime(2024, 12, 6, 12, 0)),
]
# 计算并集总小时数
total_hours1 = calculate_union_hours(time_ranges1)
print(f"1、总小时数: {total_hours1}")
total_hours2 = calculate_union_hours(time_ranges2)
print(f"2、总小时数: {total_hours2}")