ТЛ; др
myJavaUtilDate1.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
.isEqual (
myJavaUtilDate2.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
)
Избегайте устаревших классов даты и времени
Избегайте проблемных старых устаревших классов даты и времени, таких как Date
& Calendar
, которые теперь вытесняются классами java.time.
Использование java.time
A java.util.Date
представляет момент времени на UTC. Эквивалент в java.time: Instant
. Вы можете конвертировать, используя новые методы, добавленные в унаследованный класс.
Instant instant1 = myJavaUtilDate1.toInstant();
Instant instant2 = myJavaUtilDate2.toInstant();
Вы хотите сравнить по дате. Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще «вчера» в Монреаль Квебек .
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, так как они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
Примените ZoneId
к Instant
, чтобы получить ZonedDateTime
.
ZonedDateTime zdt1 = instant1.atZone( z );
ZonedDateTime zdt2 = instant2.atZone( z );
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса. Мы можем извлечь LocalDate
из ZonedDateTime
, эффективно исключая часть времени суток.
LocalDate localDate1 = zdt1.toLocalDate();
LocalDate localDate2 = zdt2.toLocalDate();
Теперь сравните, используя такие методы, как isEqual
, isBefore
и isAfter
.
Boolean sameDate = localDate1.isEqual( localDate2 );
См. , этот код работает на IdeOne.com .
instant1: 2017-03-25T04: 13: 10.971Z | Instant2: 2017-03-24T22: 13: 10,972Z
zdt1: 2017-03-25T00: 13: 10.971-04: 00 [Америка / Монреаль] | zdt2: 2017-03-24T18: 13: 10.972-04: 00 [Америка / Монреаль]
localDate1: 2017-03-25 | localDate2: 2017-03-24
sameDate: false
О 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
и more .