使用时刻检查时间是否重叠?

Ror*_*ory 11 javascript momentjs

我有一系列[start_time, end_time]时间范围如下:

let timeSegments = [];
timeSegments.push(["02:00", "07:00"])
timeSegments.push(["03:00", "04:00"])
Run Code Online (Sandbox Code Playgroud)

这些时间段重叠,因为2AM - 7AM包括3AM - 4AM

同样:

let timeSegments = [];
timeSegments.push(["14:00", "18:00"])
timeSegments.push(["15:00", "19:00"])
Run Code Online (Sandbox Code Playgroud)

2PM6PM与重叠3PM7PM.

我正在使用momentjs库,并想知道一种方法来确定我的timeSegments数组是否包含任何重叠的timeSegments?timeSegments数组最多可包含10 [start_time, end_time]对.谢谢!

我只想知道是否有任何段重叠(真/假),我不需要知道哪些段重叠等.

Alb*_*res 9

您可以timeSegmentsstart_time(使用Array.prototype.sort)排序并遍历排序列表,并检查end_time当前timeSegment的大小是否大于start_time下一个.

如果发生这种情况,则存在重叠.


Vin*_*zoC 8

您可以使用时刻范围插件.您可以使用moment.range函数传递时刻对象作为输入来创建范围(使用解析输入字符串moment(String, String)).然后,您可以使用overlap检查两个范围是否重叠的方法.

这是一个实时样本:

window['moment-range'].extendMoment(moment);

let overlap = (timeSegments) => {
  let ret = false;
  let i = 0;
  while( !ret && i<timeSegments.length-1 ){
    let seg1 = timeSegments[i];
    let seg2 = timeSegments[i+1];
    let range1 = moment.range( moment(seg1[0], 'HH:mm'),  moment(seg1[1], 'HH:mm'));
    let range2 = moment.range( moment(seg2[0], 'HH:mm'),  moment(seg2[1], 'HH:mm'));
    if( range1.overlaps(range2) ){
      ret = true;
    }
    i++;
    
    return ret;
  }
};

let timeSegments = [];
timeSegments.push(["02:00", "07:00"])
timeSegments.push(["03:00", "04:00"])
console.log( overlap(timeSegments) ); // true

timeSegments = [];
timeSegments.push(["14:00", "18:00"])
timeSegments.push(["15:00", "19:00"])
console.log( overlap(timeSegments) ); // true

timeSegments = [];
timeSegments.push(["14:00", "18:00"])
timeSegments.push(["19:00", "21:00"])
console.log( overlap(timeSegments) ); // false
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/3.0.3/moment-range.min.js"></script>
Run Code Online (Sandbox Code Playgroud)