Python中判断两个时间段是否有交集有什么好的方法吗?

时间为 datetime 对象。 start_time1 , end_time1 和 start_time2 , end_time2 判断这 2 个时间段是否有交集有什么好的方法吗?我只会用 if 按照条件判断,感觉很笨重。 请教各位 V 友!


Python中判断两个时间段是否有交集有什么好的方法吗?
15 回复

start_time1 < start_time2 < end_time1 or start_time2 < start_time1 < end_time2


判断两个时间段是否有交集,核心逻辑是检查一个时间段的开始是否早于另一个时间段的结束,并且另一个时间段的开始是否早于这个时间段的结束。用代码表示就是:

def has_overlap(start1, end1, start2, end2):
    """
    判断两个时间段 [start1, end1] 和 [start2, end2] 是否有交集。
    假设时间段是左闭右开的,即包含开始时间,不包含结束时间。
    如果包含结束时间,逻辑也适用。
    """
    # 核心判断条件:时间段1的开始 < 时间段2的结束 且 时间段2的开始 < 时间段1的结束
    return start1 < end2 and start2 < end1

# 示例用法
import datetime

# 时间段1: 今天 10:00 到 12:00
time1_start = datetime.datetime(2023, 10, 27, 10, 0)
time1_end = datetime.datetime(2023, 10, 27, 12, 0)

# 时间段2: 今天 11:00 到 13:00
time2_start = datetime.datetime(2023, 10, 27, 11, 0)
time2_end = datetime.datetime(2023, 10, 27, 13, 0)

if has_overlap(time1_start, time1_end, time2_start, time2_end):
    print("时间段有交集")
else:
    print("时间段无交集")

这个函数适用于任何可比较的对象(如datetime对象、时间戳、甚至纯数字),只要确保start总是小于或等于end。如果时间段是闭区间(包含两端),逻辑依然成立。简单说就是检查它们是否“错开”,没错开就是有交集。

总结:用 start1 < end2 and start2 < end1 这个条件判断最直接。

无交集
start_time1 < end_time2 || start_time2 < end_time1
有交集
上面取反

你再考虑一下…

max(start1, start2)<min(end1, end2)就相交了

(s2-e1)*(s1-e2) < 0

感觉 应该都是>?

#3
#6
嗯,写完发现反了,意思到了就行

记两组数据为(x1, x2) (y1, y2)
它们有交集的条件是:

arctan(y2/x1) > 1 && arctan(y1/x2) < 1


写错了,应该是 tan,而不是 arctan

好奇为啥没人说是 S 2 -E1 <0

设 a 为 各个活动持续时间之和
设 b 为 max(E1,E2,…,EN) - min(S1,S2,…,SN)
如果 a > b,说明有交集

同好奇

咦,好像就这么简单啊

错了,这样有可能不相交的,S1>E2

回到顶部