判断包含跨天场景的时间段是否重叠的逻辑求解
时间段重叠判断逻辑实现方案
前置准备
- 先将所有
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),跨天
实现步骤
- 将待判断的时间段T转换为(s_t, e_t)格式
- 分别判断T与A、T与P、T与N是否重叠
- 只要任意一组判断结果为真,即判定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
相关产品推荐
相关产品推荐

