You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

代码说明

  1. 时间解析:兼容多种输入格式,包括带AM/PM、不带时段标识、小数形式(如2.30)的时间字符串,统一转换为datetime对象。
  2. 区间处理:自动纠正输入时间的顺序,确保区间开始早于结束。
  3. 重叠计算:通过取两个区间的最大开始时间和最小结束时间,确定重叠区间,再转换为小时数返回。

内容的提问来源于stack exchange,提问作者user19986231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:01:35