tl; dr
Утверждение:
myJavaUtilDate // An object of type `java.util.Date`, a terrible legacy class that is no longer used.
.toInstant() // Convert from legacy class `java.util.Date` to modern `java.time.Instant`. Both classes represent a moment in UTC.
.atZone( // Adjust from UTC to a time zone.
ZoneId.of( "America/New_York" ) // Real time zone names are in format `Continent/Region`, never 2-4 letter pseudo-zones such as `EST`, `CST`, or `IST`.
) // Returns a `ZonedDateTime` object. Same moment, different wall-clock time.
.toLocalDate() // Extract the date only.
.toString() // Generate text representing that date, in standard ISO 8601 format.
.equals(
"2020-01-23"
)
Избегайте устаревших классов даты и времени
Вы используете ужасные классы, которые были вытеснены годами go современные java .time классы с принятием JSR 310.
LocalDate
Для значения только на дату без времени суток и без времени зона, используйте java.time.LocalDate
.
Ваша входная строка соответствует стандарту ISO 8601. Классы java .time по умолчанию используют стандартные форматы при разборе / генерации строк. Так что нет необходимости в шаблонах форматирования.
LocalDate ld = LocalDate.parse( "2020-01-23" ) ;
Преобразование устаревших объектов
Если задано java.util.Date
по старому коду, который еще не обновлен до java .time , преобразуйте. Вызовите новые методы преобразования, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
И Instant
, и Date
представляют момент в UT C. То есть оба имеют смещение нуля часов, минут и секунд.
В любой данный момент дата меняется по всему земному шару в зависимости от зоны. Это «завтра» в Японии и еще «вчера» в Мексике. Таким образом, вы должны указать часовой пояс, по которому вы хотите просмотреть дату.
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Извлечение значения только для даты.
LocalDate ld = zdt.toLocalDate() ;
Генерация текста и сравнение в вашем утверждении.
String output = ld.toString() ; // Genetate text in standard ISO 8601 format.