Python实现两时间区间与指定时段的重叠时长计算
时间区间重叠时长计算实现需求
需实现功能:判断任意两个时间组成的区间是否与指定参考区间(下午2点至下午3点)存在重叠,并计算重叠时长。
示例说明
- 示例1
输入区间:t1=12 PM、T2=2.30 PM
重叠时长:0.5 hours - 示例2
输入区间:t1=2.0 pm、t2=4 pm
重叠时长:1 hours - 示例3
输入区间:t1=12、t2=5pm
重叠时长:2 hours
Python代码实现
from datetime import datetime def calculate_overlap_duration(t1_str, t2_str): # 定义参考时间区间:下午2点(14:00)到下午3点(15:00) ref_start = datetime.strptime("14:00", "%H:%M") ref_end = datetime.strptime("15:00", "%H:%M") # 时间字符串解析函数,兼容多种输入格式 def parse_time(time_str): time_str = time_str.lower().strip() # 处理不带AM/PM的输入,默认中午12点为PM,其余整数小时为AM if not ("am" in time_str or "pm" in time_str): if "." in time_str: # 处理小数形式(如2.30),拆分小时和分钟 hour_part, minute_part = time_str.split(".") minute_part = f"{int(minute_part):02d}" # 补零确保两位格式 time_str = f"{hour_part}:{minute_part} pm" if int(hour_part) >=12 else f"{hour_part}:{minute_part} am" else: # 处理整数小时(如12) time_str = f"{time_str}:00 pm" if time_str == "12" else f"{time_str}:00 am" # 处理带小数点的时间(如2.0 pm),替换为冒号并补零 if "." in time_str: time_str = time_str.replace(".", ":") parts = time_str.split(":") if len(parts[1]) == 1: parts[1] += "0" time_str = ":".join(parts) # 尝试两种格式解析时间 try: return datetime.strptime(time_str, "%I:%M %p") except ValueError: return datetime.strptime(time_str, "%I %p") # 解析输入的两个时间 t1 = parse_time(t1_str) t2 = parse_time(t2_str) # 确保区间的开始时间早于结束时间 interval_start = min(t1, t2) interval_end = max(t1, t2) # 计算重叠区间的起止时间 overlap_start = max(interval_start, ref_start) overlap_end = min(interval_end, ref_end) # 计算重叠时长,无重叠则返回0 if overlap_start >= overlap_end: return 0.0 else: duration_hours = (overlap_end - overlap_start).total_seconds() / 3600 return round(duration_hours, 1) # 测试示例 print("示例1重叠时长:", calculate_overlap_duration("12 PM", "2.30 PM"), "hours") print("示例2重叠时长:", calculate_overlap_duration("2.0 pm", "4 pm"), "hours") print("示例3重叠时长:", calculate_overlap_duration("12", "5pm"), "hours")
代码说明
- 时间解析:兼容多种输入格式,包括带AM/PM、不带时段标识、小数形式(如
2.30)的时间字符串,统一转换为datetime对象。 - 区间处理:自动纠正输入时间的顺序,确保区间开始早于结束。
- 重叠计算:通过取两个区间的最大开始时间和最小结束时间,确定重叠区间,再转换为小时数返回。
内容的提问来源于stack exchange,提问作者user19986231
相关产品推荐
相关产品推荐

