如何在jQuery或JavaScript中检查时间重叠

3

我有一个 jQuery 中的类似下面的数组对象

var subevent = [
 {
  start: Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time),
  end: Fri Jun 23 2017 14:15:00 GMT+0530 (India Standard Time) 
 },
 {
  start: Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time),
  end: Fri Jun 23 2017 16:15:00 GMT+0530 (India Standard Time) 
 },
 {
  start: Fri Jun 23 2017 16:15:00 GMT+0530 (India Standard Time),
  end: Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time) 
 },
 .
 .
 .
]

如何检查两个时间是否不重叠?

在这个例子中,预期的结果是什么? - Andreas
请查看此链接:https://dev59.com/CJXfa4cB1Zd3GeqPZxYt - Jayanti Lal
谢谢 @Unnati,我有一个类似的问题关于重叠。您必须检查事件结束时间是否大于另一个事件的开始时间?如果不是,则它们不重叠。 - Jaykumar Gondaliya
1
你只是想检查还是想要唯一的组合? - Mayank Pandeyz
关于Mayank Pandey的问题:您想得到什么输出? - Jonas Wilms
3个回答

2
请按照以下示例将unixtime传递为数组。
var subevent = [
 {
  start: Mon Jun 26 2017 10:15:00 GMT+0530 (India Standard Time),
  startunix: 1498452300000,
  end: Mon Jun 26 2017 11:15:00 GMT+0530 (India Standard Time),
  endunix: 1498455900000
 },
 {
  start: Mon Jun 26 2017 11:15:00 GMT+0530 (India Standard Time),
  startunix: 1498455900000,
  end: Mon Jun 26 2017 12:15:00 GMT+0530 (India Standard Time),
  endunix: 1498459500000
 }
]

然后按时间升序排序数组

var sortedArray = subevent.sort(function(a,b){
    return a.startunix - b.startunix;
});

在for循环中使用已排序的数组,并将结束时间存储在一个变量lastEndTime中,然后像下面的代码一样检查当前迭代的开始时间与lastEndTime变量是否相同。

var errorFlag = 0;
var lastEndTime;
for(var i=0; i<sortedArray.length; i++) {
    var currentStartTime;

    if( sortedArray[i].endunix <= sortedArray[i].startunix ){
        alert('time slot conflict')
        errorFlag = 1;
        break;
    }

    if( !lastEndTime ) {

        lastEndTime = sortedArray[i].endunix;
        //console.log(" i where last end time not exists = "+i+" lastEndTime "+lastEndTime);
    } else {
        currentStartTime = sortedArray[i].startunix;
        //console.log(" i where last end time  exists = "+i+" currentStartTime "+currentStartTime+" lastEndTime "+lastEndTime );
        if ( currentStartTime < lastEndTime ) {
            alert('time overlapping')
            errorFlag = 1;
            break;
        }

        lastEndTime = sortedArray[i].endunix;
    } 

}
console.log(errorFlag);

还有显示警告或错误标志,如果警告显示或错误标志为1,则表示出现了问题,否则一切正常。


0

尝试使用new Date().getTime()

在我的答案中

  1. true表示两个时间相同
  2. 检查每个对象的status,以确定它们是否重叠

var subevent = [{ start: "Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time)", end: "Fri Jun 23 2017 14:15:00 GMT+0530 (India Standard Time)"},{ start: "Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time)", end: "Fri Jun 23 2017 16:15:00 GMT+0530 (India Standard Time)"}, { start: "Fri Jun 23 2017 16:15:00 GMT+0530 (India Standard Time)", end: "Fri Jun 23 2017 15:15:00 GMT+0530 (India Standard Time)"},]

subevent.forEach(function(a) {
  a.status = new Date(a.start).getTime() == new Date(a.end).getTime();
})

console.log(subevent)


如果一个对象有从下午1:00到下午2:00的时间,另一个对象有从下午1:30到下午2:30的时间,则这里第二组时间发生了重叠。因此,我该如何检查第一组时间是否已经发生了重叠? - Unnati

0

试试这个,它会检查结束日期是否在开始日期之前。

var subevent = [{
    start: 'Fri Jun 23 2017 15:15:00 GMT+0530(India Standard Time)',
    end: 'Fri Jun 23 2017 14:15:00 GMT+0530(India Standard Time)'
  },
  {
    start: 'Fri Jun 23 2017 15:15:00 GMT+0530(India Standard Time)',
    end: 'Fri Jun 23 2017 16:15:00 GMT+0530(India Standard Time)'
  },
  {
    start: 'Fri Jun 23 2017 16:15:00 GMT+0530(India Standard Time)',
    end: 'Fri Jun 23 2017 15:15:00 GMT+0530(India Standard Time)'
  }
];

for (let event of subevent) {
  let startTime = new Date(event.start).getTime(),
      endTime   = new Date(event.end).getTime();
      
  event.isOverlapping = endTime <= startTime;
}

console.log(subevent);


如果一个对象的时间是下午1:00到2:00,另一个对象的时间是下午1:30到2:30,那么这里第二组时间会重叠。因此,我该如何检查...第一组时间已经重叠了? - Unnati
应用相同的逻辑,但是将每个项目与其他项目进行比较。 - Serge K.
@NathanP. 您能否提供一些链接、演示、jsFiddle或Plunker,展示Unnati上面的评论?这样我就能更好地了解问题,因为我也遇到了同样的问题,真的想摆脱这种困境。 - sagar patel

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