Математическое решение, данное @Bretana, является хорошим, но пренебрегает двумя конкретными деталями:
О закрытом или открытом состоянии интервальных границ, решение @Bretana, действительное для закрытых интервалов
(StartA & lt; = EndB) и (EndA> = StartB)
можно переписать для полуоткрытых интервалов:
(StartA & lt; EndB) и (EndA> 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 & lt; endB), поэтому Time4J (и другие библиотеки тоже) должны обрабатывать его как специальный фронт в чтобы гарантировать, что перекрытие любого произвольного интервала с пустым интервалом не существует. Конечно, интервалы дат (которые закрыты по умолчанию в Time4J, но могут быть полуоткрытыми, также как и пустые интервалы даты) обрабатываются аналогичным образом.