比较JavaScript中两个日期时间间隔的交集

3

我有两个日期时间间隔:

first stardate : 2014-06-20#00:01
first enddate  : 2014-06-24#23:59

second startdate : 2014-06-25#00:01
second enddate   : 2014-06-27#23:59

我可以将startdate < enddate解析为整数进行比较,例如201406200001 < 201406242359。

但我想要比较第一个日期区间和第二个日期区间的交集。

第一个区间可以大于或小于第二个区间,但这两个区间不应有任何交集。

我该如何在JavaScript中编写此算法?


所以,你想要检查这两个区间是否重叠? - Cerbrus
从高层次上看,你可以检查:first.startdate是否在second.startdate和second.enddate之间;或者second.startdate是否在first.startdate和first.enddate之间。如果任何一个条件成立,那么你的日期重叠了。 - Nikhil Talreja
第二个开始日期:2014-06-23#00:01 第二个结束日期:2014-06-27#23:59 对我来说是错误的。 - pckmn
3个回答

1

好的,如果你把它们作为数字进行比较:

if( (start1 > start2 && start1 < end2) || (start2 > start1 && start2 < end1) ) 

这适用于重叠的区间。 基本上,它检查第一个区间的开头是否在第二个区间内,或者第二个区间的开头是否在第一个区间内。

这里没有处理 start1 = start2 或 end1 = end2 的情况。 - Çağatay Sel

1
这解决了我的问题,就像这个问题提出的那样。我需要从另一个链接中获取这个解决方案。我只需根据问题的要求对日期进行调整即可。
测试很容易。您可以使用浏览器的控制台。

function intercept(start1,end1,start2,end2) {
    return ( Math.max(0, Math.min(end2, end1) - Math.max(start1, start2) + 1) ) > 0
}

console.log('I should be true >> ', intercept(new Date("2018/01/01"), new Date("2018/01/05"), new Date("2018/01/05"), new Date("2018/02/03")))
console.log('I should be false >> ', intercept(new Date("2018/01/01"), new Date("2018/01/05"), new Date("2018/01/06"), new Date("2018/02/03")))
console.log('I should be true >> ', intercept(new Date("2018/01/01"), new Date("2018/01/05"), new Date("2018/01/03"), new Date("2018/02/03")))

附加细节:此代码考虑拦截,当区间“接触”时(例如 [1,2] 和 [2,4])。如果您只想排除接触,并仅考虑真正的重叠(例如 [1,3] 和 [2,4]),请在函数内部删除“+1”。随意!

再次向真正的鼓掌。


0
如果您想检查这些区间是否重叠,可以使用以下代码:
var datesOverlap = (start1 < end2 && start1 > start2) ||
                   (start2 < end1 && start2 > start1);

基本上,如果间隔1在间隔2结束之前开始,则间隔1可能不会在间隔2之后开始,反之亦然。
(因此,间隔1的开始或结束不能在2的开始和结束之间,反之亦然)

这假定您已将日期转换为Date对象,并比较它们的数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接