самый простой
Самый простой способ - использовать хорошо спроектированную выделенную библиотеку для работы с датой.
someInterval.overlaps( anotherInterval )
java.time & амп; ThreeTen-Extra
Лучшим в бизнесе является структура
java.time
, встроенная в Java 8 и более поздние версии. Добавьте к этому проект ThreeTen-Extra , который дополняет java.time дополнительными классами, в частности классомInterval
, который нам нужен здесь.Что касается тег
language-agnostic
в этом Вопросе, исходный код для обоих проектов доступен для использования на других языках (помните о своих лицензиях).
Interval
Класс
org.threeten.extra.Interval
удобен, но для него требуются моменты времени дат (java.time.Instant
), а не только значения даты , Поэтому мы переходим к использованию первого момента дня в UTC для представления даты.Instant start = Instant.parse( "2016-01-01T00:00:00Z" ); Instant stop = Instant.parse( "2016-02-01T00:00:00Z" );
Создайте
Interval
для представления этого промежутка времени.Interval interval_A = Interval.of( start , stop );
Мы также можем определить
Interval
с начальным моментом плюсDuration
.Instant start_B = Instant.parse( "2016-01-03T00:00:00Z" ); Interval interval_B = Interval.of( start_B , Duration.of( 3 , ChronoUnit.DAYS ) );
Сравнение с тестом на перекрытия очень просто.
Boolean overlaps = interval_A.overlaps( interval_B );
Вы можете сравнить
Interval
с другимInterval
илиInstant
:Все они используют подход
Half-Open
для определения промежутка времени, в котором начало включено , а окончание - exclusive .