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

判断包含跨天场景的时间段是否重叠的逻辑求解

时间段重叠判断逻辑实现方案

前置准备

  • 先将所有HH:MM格式的时间转换为当日0点起的分钟整数,公式为小时数 * 60 + 分钟数,取值范围为0~1439(24小时对应1440分钟)
  • 每个时间段记为(s: 开始分钟数, e: 结束分钟数),如果e < s则判定为跨天时间段

核心通用判断逻辑

1. 非跨天时间段重叠判断(边界不包含)

对于两个均不跨天的时间段X(a_s, a_e)、Y(b_s, b_e),满足如下条件即判定为重叠:

a_s < b_e AND b_s < a_e

该逻辑天然满足边界不包含要求:例如06:00-07:00(360,420)和07:00-08:00(420,480)代入得360 < 480 AND 420 < 420,结果为假,完全符合规则要求。

2. 包含跨天场景的任意两个时间段重叠判断

将跨天的时间段拆分为两个非跨天的子段:若时间段X(s,e)为跨天,则拆分为X1(s, 1440)、X2(0, e);非跨天时间段仅保留自身一个子段。
只要双方的任意子段满足上述非跨天重叠规则,即判定两个时间段重叠。

目标场景实现(判断是否与A/P/N任意时段重叠)

首先固定A/P/N三个基准时段的参数:

  • A:s=420(07:00),e=1020(17:00),非跨天
  • P:s=720(12:00),e=1320(22:00),非跨天
  • N:s=1320(22:00),e=480(08:00),跨天

实现步骤

  1. 将待判断的时间段T转换为(s_t, e_t)格式
  2. 分别判断T与A、T与P、T与N是否重叠
  3. 只要任意一组判断结果为真,即判定T与三个基准时段存在重叠

可直接参考的伪代码示例

# 时间字符串转分钟工具
def time_to_min(time_str):
    h, m = map(int, time_str.split(":"))
    return h * 60 + m

# 时间段拆分为非跨天子段工具
def split_segment(s, e):
    if e > s:
        return [(s, e)]
    else:
        return [(s, 1440), (0, e)]

# 两个任意时间段是否重叠判断
def is_overlap(s1, e1, s2, e2):
    seg1 = split_segment(s1, e1)
    seg2 = split_segment(s2, e2)
    for a_s, a_e in seg1:
        for b_s, b_e in seg2:
            if a_s < b_e and b_s < a_e:
                return True
    return False

# 基准时段参数预定义
A_S, A_E = time_to_min("07:00"), time_to_min("17:00")
P_S, P_E = time_to_min("12:00"), time_to_min("22:00")
N_S, N_E = time_to_min("22:00"), time_to_min("08:00")

# 最终对外调用方法:输入待判断时段的开始、结束时间字符串,返回是否重叠
def is_overlap_with_apn(t_start, t_end):
    s_t = time_to_min(t_start)
    e_t = time_to_min(t_end)
    return is_overlap(s_t, e_t, A_S, A_E) or \
           is_overlap(s_t, e_t, P_S, P_E) or \
           is_overlap(s_t, e_t, N_S, N_E)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:24:03