ТЛ; др
ZoneId z = ZoneId.of( "America/Montreal" ); // A date only has meaning within a specific time zone. For 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*.
)
Half-Open
В работе с датой и временем обычно используется подход «полуоткрытый» для определения промежутка времени. Начало включительно , а окончание эксклюзив . Таким образом, неделя, начинающаяся с понедельника, заканчивается, но не включает следующий понедельник.
java.time
Java 8 и более поздние версии поставляются со встроенным фреймворком java.time . Заменяет старые проблемные классы, включая java.util.Date/.Calendar и SimpleDateFormat. Вдохновленный успешной библиотекой Joda-Time. Определено JSR 310. Расширено проектом ThreeTen-Extra.
Instant
- это момент на временной шкале в UTC с наносекундным разрешением.
Instant
Конвертируйте ваши объекты java.util.Date в Мгновенные объекты.
Instant start = myJUDateStart.toInstant();
Instant stop = …
При получении объектов java.sql.Timestamp через JDBC из базы данных конвертировать в java.time.Instant аналогичным образом. Java.sql.Timestamp уже находится в UTC, поэтому не нужно беспокоиться о часовых поясах.
Instant start = mySqlTimestamp.toInstant() ;
Instant stop = …
Получить текущий момент для сравнения.
Instant now = Instant.now();
Сравните, используя методы isBefore, isAfter и equals.
Boolean containsNow = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;
LocalDate
Возможно, вы хотите работать только с датой, а не с временем суток.
Класс LocalDate
представляет значение только для даты, без времени суток и без часового пояса.
LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
Чтобы получить текущую дату, укажите часовой пояс. В любой момент сегодняшняя дата варьируется в зависимости от часового пояса. Например, в Париже новый день наступает раньше, чем в Монреале.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Мы можем использовать методы isEqual
, isBefore
и isAfter
для сравнения. В работе с датой и временем мы обычно используем подход Half-Open, где начало промежутка времени составляет включительно , а окончание exclusive .
Boolean containsToday = ( ! today.isBefore( start ) ) && ( today.isBefore( stop ) ) ;
Interval
Если вы решили добавить библиотеку ThreeTen-Extra в свой проект, вы можете использовать класс Interval
для определения промежутка времени. Этот класс предлагает методы для проверки, если интервал содержит , примыкает , охватывает или перекрывается другими датами / интервалами.
Класс Interval
работает с Instant
объектами. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Мы можем настроить LocalDate
на определенный момент, первый момент дня, указав часовой пояс для получения ZonedDateTime
. Оттуда мы можем вернуться в UTC, извлекая 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 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , в настоящее время находящийся в режиме обслуживания , рекомендует перейти на java.time классы.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
- Java SE 8 и SE 9 и более поздние
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и еще .