判断两个日期区间、时间区间、IP 地址段是否存在交集是很常见的需求。
具体来说:
-
1.1.1.0/24 和 1.1.1.0/31 这两个 IP 段中是否有重叠的地址?
-
一个故障事件发生在 11:20 - 13:10 ,客户使用服务的时间是 12:10 - 16:00 这个客户是否受到这个故障的影响?
可以把 IP 转换为 int 形式,同样把时间转换为 Unix 时间戳形式。那么这类问题就变成了为判断 [ A, B ],[ x, y ] 两个闭区间是否存在交集。
提出一种判断方法供大家一起讨论。
考虑到必然存在 A < B
,x < y
,按从小到大列出 A、B、x、y 四个数可能的情况:
A B x y B ≠ x 时无交集 A x B y 有交集 A x y B 有交集 x A B y 有交集 x A y B 有交集 x y A B y ≠ A 时无交集
发现无交集的情况更少,除了无交集的情况就是有交集的情况,对无交集的条件取反即为有交集。
当 B < x
为第一种情况。当 y < A
时为最后一种情况。
有交集的情况判断条件可以写为:NOT ( B < x OR y < A )
根据德摩根定律:
!(P || Q) = !P && !Q !(P && Q) = !P || !Q
简化判断条件:B ≥ x AND y ≥ A
虽然这个条件看起来很无厘头,但是观察上文列出的几种组合情况,它就是中间四个有交集情况的总结。
文章评论