【问题标题】:how to check time overlap in jquery or javascript如何在 jquery 或 javascript 中检查时间重叠
【发布时间】:2017-11-26 19:12:00
【问题描述】:

我在 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) 
 },
 .
 .
 .
]

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

【问题讨论】:

  • 这个例子的预期结果是什么?
  • 谢谢@Unnati,我有类似的重叠问题。您必须检查事件结束时间大于另一个事件开始时间吗?如果不是,那么它不重叠
  • 您只是想检查还是想要独特的组合?
  • 关于 mayank pandeyz 的问题:你想要的输出是什么?

标签: javascript jquery


【解决方案1】:

请像下面的例子一样在数组中传递 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 循环中使用排序数组并将 endunix 时间存储在一个变量 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);

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

【讨论】:

    【解决方案2】:

    试试这个,它会检查结束日期是否早于开始日期。

    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,那么这里第二组时间会重叠。因此,我如何检查...第一组时间是否已经重叠?
    • 应用相同的逻辑,但将每个项目与其他项目进行比较。
    • @NathanP。您能否提供一些链接、演示、jsFiddle 或 unnati 上述评论的 plunker ?所以我可以更好地了解我有同样的问题并且真的想摆脱这种情况。
    【解决方案3】:

    试试new Date().getTime()

    在我的回答中

    1. true 表示两者是同一时间
    2. 检查每个对象的status是否显示重叠​​li>

    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,那么这里第二组时间会重叠。因此,我如何检查...第一组时间是否已经重叠?
    猜你喜欢
    • 2016-08-25
    • 2014-08-29
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多