时间段交集计算

文章转发自:https://www.jianshu.com/p/b571bc0a4372

业务逻辑

逻辑很简单,就是一两个日期段取交集,可如果按正常思维去实现,其实日期交集的场景我们可以穷举出来,大概有4种情况

1、

1
2
s1--------------e1
s2-----------------e2

2、

1
2
    s1--------------e1
s2-----------e2

3、

1
2
s1-----------------e1
s2-------e2

4、

1
2
3
     s1-------e1
s2-----------------------e2

如果按这种逻辑实现我们的表达式可能至少要写4种情况,逻辑复杂,且可读性差

逆向思维

这是软件开发中非常重要的思维模式,在程序员数学中有重点介绍。
这里提到的程序员数学,是一套书,包括程序员基础数学,概率论和线性代数,同时也是进入机器学习的基础理论,有兴趣的朋友可以买回来读一读。
我们通过个例子,来实践一下逆向思维。
其实如果按取交集的逻辑来看,上面穷举出来有4 种情况。
但我们反过来想(逆向)
没有交集的情况只有两种可能

1、

1
2
            s1-------------e1
s2------e2

2、

1
2
3
4
5
6
7
8
    s1------e1
s2--------------e2

```
我们设两个时间段的日期为`s1(start)-e1(end)`和`s2-e2`,通过逆向推导可以推出下列表达式

这里我们假定

s1<e1 & s2<e2

1
=>

e2<s1||e1<s2

1
2
3

说明满足该条件是不可能产生交集。上述表达式翻译成业务语言即,第一个时间段已经结束,第二个时间段还没未开始,通过对表达式取非即所有存在交集的情况

!(e2<s1||e1<s2)

1
=>

e2>=s1&&e1>=s2

这个就可以做为时间取交集的最终表达式,这里有一点非常重要,这个时间段我们有条件的
`s1<e1 & s2<e2`
这是表达式成立的充分条件

时间段交集计算
http://yoursite.com/2021/12/05/PHP/时间交集/
作者
mohuani
发布于
2021年12月5日
许可协议