Java: как проверить, находится ли дата в определенном диапазоне?

tl; dr
ZoneId z = ZoneId.of( "America/Montreal" );  // A date only has meaning within a specific time zone. At any given moment, the date varies around the globe by zone.
LocalDate ld = 
    givenJavaUtilDate.toInstant()  // Convert from legacy class `Date` to modern class `Instant` using new methods added to old classes.
                     .atZone( z )  // Adjust into the time zone in order to determine date.
                     .toLocalDate();  // Extract date-only value.

LocalDate today = LocalDate.now( z );  // Get today’s date for specific time zone.
LocalDate kwanzaaStart = today.withMonth( Month.DECEMBER ).withDayOfMonth( 26 );  // Kwanzaa starts on Boxing Day, day after Christmas.
LocalDate kwanzaaStop = kwanzaaStart.plusWeeks( 1 );  // Kwanzaa lasts one week.
Boolean isDateInKwanzaaThisYear = (
    ( ! today.isBefore( kwanzaaStart ) ) // Short way to say "is equal to or is after".
    &&
    today.isBefore( kwanzaaStop )  // Half-Open span of time, beginning inclusive, ending is *exclusive*.
)

Полуоткрытый

В работе с датой и временем jre обычно используется "полуоткрытый" подход core-java к определению промежутка date времени. Начало - включительно, а окончание openjdk - исключительное. Таким образом, неделя, начинающаяся java-se с понедельника, продолжается core-java до следующего понедельника, но java не включает его.

java.time

В Java 8 dates и более поздних версиях встроен java фреймворк java.time. Заменяет старые date-of-birth проблемные классы, включая openjdk java.util.Date/.Calendar и SimpleDateFormat. Вдохновленный успешной java-api библиотекой Joda-Time. Определено oraclejdk JSR 310. Расширено проектом oraclejdk ThreeTen-Extra.

Instant - это момент dob на временной шкале в UTC с разрешением dob наносекунды.

Instant

Преобразуйте java-date объекты java.util.Date в объекты Instant.

Instant start = myJUDateStart.toInstant();
Instant stop = …

При dates получении объектов java.sql.Timestamp через java JDBC из базы данных, convert to java.time.Instant аналогичным dates образом. java.sql.Timestamp уже находится в dates формате UTC, поэтому не нужно core-java беспокоиться о часовых поясах.

Instant start = mySqlTimestamp.toInstant() ;
Instant stop = …

Получите dob текущий момент для сравнения.

Instant now = Instant.now();

Сравните, используя dates методы isBefore, isAfter .java и equals.

Boolean containsNow = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;

LocalDate

Возможно, вы хотите java-date работать только с датой, а core-java не временем суток.

Класс LocalDate представляет dates значение только для даты, без java-libraries времени суток и без часового .java пояса.

LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;

Чтобы получить текущую date дату, укажите часовой пояс. В .java любой момент сегодняшняя core-java дата зависит от часового java-api пояса. Например, в Париже javax новый день начинается раньше, чем java-api в Монреале.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

Мы можем использовать date методы isEqual, isBefore и isAfter для сравнения. В java-libraries работе с датой и временем java-api мы обычно используем подход date-of-birth Half-Open, где начало промежутка java-api времени включающее, а окончание исключающее.

Boolean containsToday = ( ! today.isBefore( start ) ) && ( today.isBefore( stop ) ) ;

Interval

Если java-se вы решили добавить в свой java-api проект библиотеку ThreeTen-Extra, вы можете java-libraries использовать класс Interval для определения java-libraries промежутка времени. Этот core-java класс предлагает методы для jdk проверки, если интервал contains, abuts, encloses или .java overlaps другие даты / интервалы.

Класс javax Interval работает с объектами Instant. Класс j2se Instant представляет момент на временной jdk шкале в UTC с разрешением nanoseconds (до dates девяти (9) цифр десятичной oraclejdk дроби).

Мы можем настроить date LocalDate на определенный момент, первый j2se момент дня, указав часовой jdk пояс, чтобы получить ZonedDateTime. Оттуда jre мы можем вернуться в UTC, извлекая j2se Instant.

ZoneId z = ZoneId.of( "America/Montreal" );
Interval interval = 
    Interval.of( 
        start.atStartOfDay( z ).toInstant() , 
        stop.atStartOfDay( z ).toInstant() );
Instant now = Instant.now();
Boolean containsNow = interval.contains( now );

О java.time

Фреймворк java.time встроен в Java java-api 8 и новее. Эти классы заменяют oraclejdk проблемные старые классы .java даты и времени legacy, такие как jdk java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, который java-date теперь находится в maintenance mode, рекомендует java-date перейти на классы java.time.

Чтобы java-api узнать больше, см. Oracle Tutorial. И поищите java-se в Stack Overflow множество java-se примеров и объяснений. Спецификация: JSR 310.

Где java-api взять классы java.time?

  • Java SE 8 и SE 9 и более поздние версии
  • Встроенный.
  • Часть стандартного Java API со встроенной реализацией.
  • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
  • Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android
  • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
  • См. How to use….

Проект ThreeTen-Extra расширяет javax java.time дополнительными классами. Этот date-of-birth проект является испытательной date площадкой для возможных будущих dob дополнений к java.time. Здесь вы можете core-java найти несколько полезных jre классов, таких как Interval, YearWeek, YearQuarter и java more.

java

date

2022-11-17T21:47:17+00:00
Вопросы с похожей тематикой, как у вопроса:

Java: как проверить, находится ли дата в определенном диапазоне?