Проверить, не совпадают ли времена с моментом?
У меня есть массив временных диапазонов [start_time, end_time]
, например:
let timeSegments = [];
timeSegments.push(["02:00", "07:00"])
timeSegments.push(["03:00", "04:00"])
Эти временные сегменты перекрываются, поскольку 2AM - 7AM
включает 3AM - 4AM
Аналогично:
let timeSegments = [];
timeSegments.push(["14:00", "18:00"])
timeSegments.push(["15:00", "19:00"])
2PM
до 6PM
перекрывается с 3PM
до 7PM
.
Я использую библиотеку momentjs и хотел бы узнать способ определить, содержит ли мой массив timesSegments любые временные интервалы, которые перекрываются? Массив timesSegments может содержать не более 10 [start_time, end_time]
пар. Спасибо!
Мне бы хотелось узнать, перекрываются ли какие-либо сегменты (true/false), мне не нужно знать, какой из сегментов перекрывается и т.д.
Ответы
Ответ 1
Вы можете отсортировать timeSegments
по start_time
(используя Array.prototype.sort
) и перебрать отсортированный список и проверить, больше ли end_time
текущего временного сегмента, чем start_time
следующего.
Если это произойдет, то есть совпадение.
Ответ 2
Вы можете использовать плагин момента-диапазона. Вы можете создать диапазон, используя функцию 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
<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>
Ответ 3
Вы можете взять справочную форму следующего кода. Я использую основной JavaScript для этого.
<script>
var obj = [{ "from": "08:00", "to": "9:01" }, { "from": "18:45", "to": "19:00" }, { "from": "08:00", "to": "09:00" }, { "from": "12:00", "to": "14:00" }];
obj = sortTime(obj);
console.log(obj);
if (checkoverlapping(obj)) {
alert("yes time overlaps");
} else {
alert("No overlapping")
}
function sortTime(obj) {
obj.sort(function (a, b) {
KeyA = minuteValue(a.from);
KeyB = minuteValue(b.from);
if (KeyA < KeyB) return -1;
else if (KeyA > KeyB) return 1;
else {
a = minuteValue(a.to);
b = minuteValue(b.to);
if (a < b) return -1;
if (a > b) return 1;
return 0
}
})
return obj;
}
function minuteValue(time) {
time = time.split(":");
return (time[0] * 60) + (time[1] * 1);
}
function checkoverlapping(obj) {
let previous = obj[0], current, overlapping = false;
for (let i = 1; i < obj.length; i++) {
current = obj[i]
if (minuteValue(previous.to) > minuteValue(current.from)) {
overlapping = true;
break;
}
}
return overlapping;
}
</script>