Математическое решение, данное @Bretana, хорошо, но игнорирует две конкретные детали:
- аспект закрытых или полуоткрытых интервалов
- пустые интервалы
О закрытом или открытом состоянии интервальных границ, решение @Bretana действует для закрытых интервалов
(StartA <= EndB) и (EndA> = StartB)
можно переписать для полуоткрытых интервалов в:
(StartA StartB)
Это исправление необходимо, поскольку открытая граница интервала по определению не принадлежит диапазону значений интервала.
И около пустых интервалов , хорошо, здесь показанные выше отношения НЕ сохраняются. Пустые интервалы, которые не содержат никаких допустимых значений по определению, должны обрабатываться как особый случай. Я демонстрирую это своей библиотекой времени Java Time4J на следующем примере:
MomentInterval a = MomentInterval.between(Instant.now(), Instant.now().plusSeconds(2));
MomentInterval b = a.collapse(); // make b an empty interval out of a
System.out.println(a); // [2017-04-10T05:28:11,909000000Z/2017-04-10T05:28:13,909000000Z)
System.out.println(b); // [2017-04-10T05:28:11,909000000Z/2017-04-10T05:28:11,909000000Z)
Первая квадратная скобка «[» обозначает закрытое начало, в то время как последняя скобка «)» обозначает открытый конец.
System.out.println(
"startA < endB: " + a.getStartAsInstant().isBefore(b.getEndAsInstant())); // false
System.out.println(
"endA > startB: " + a.getEndAsInstant().isAfter(b.getStartAsInstant())); // true
System.out.println("a overlaps b: " + a.intersects(b)); // a overlaps b: false
Как показано выше, пустые интервалы нарушают условие перекрытия, описанное выше (особенно startA