tl; dr
myJavaUtilDate
.toInstant()
.atZone
(
ZoneId.of( "Asia/Kolkata" )
)
.toLocalDate()
.isEqual
(
LocalDate
.parse
(
"03/10/2020" , // Do you mean March 10th, or October 3rd?
DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) // Or "MM/dd/uuuu".
)
)
Смарт-объекты, а не тупые строки
Вы сказали:
сделать 3 даты в одном формате, чтобы я мог сравнивать их
Использовать объекты с методами сравнения, а не сравнивать текст строк.
У нас есть класс для дат, встроенный в Java: LocalDate
.
java .time
Вы используете Date
который является одним из ужасных классов даты и времени в комплекте с самыми ранними версиями Java. Эти классы теперь устарели, вытеснив годы на go с принятием JSR 310, который определяет java .time классов.
Я прошел дату
При обнаружении объекта java.util.Date
немедленно преобразуйте его в современную замену java.time.Instant
. Используйте новый метод преобразования toInstant
, добавленный к старому классу.
Instant instant = myJavaUtilDate.toInstant() ;
И java.util.Date
, и java.time.Instant
представляют момент в UT C. Это то, как вы хотите воспринимать дату в UT C со смещением нуля часов-минут-секунд от основного меридиана? Имейте в виду, что в любой данный момент дата меняется по всему земному шару в зависимости от зоны. Моментом может стать «завтра» в Токио, Япония, и еще «вчера» в Толедо, штат Огайо, США.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Извлечение даты.
LocalDate ld = odt.toLocalDate() ; // Extract the date only, omitting the time-of-day and the offset-from-UTC.
Или вы хотите воспринимать эту дату в определенной зоне?
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
LocalDate ld = zdt.toLocalDate() ; // Extract the date only, omitting the time-of-day and the zone.
и две строки к функции
Определите шаблон форматирования для соответствия вашим вводам.
String input = "03/10/2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ; // Throws `DateTimeParseException` if input is faulty.
Теперь сравните, используя методы isEqual
, isAfter
, isBefore
.
boolean datesMatch = ld1.isEqual( ld2 ) && ld2.isEqual( ld3 ) ;
java.util.Date::toString
говорит ie
Вы спросили:
D2 = sat Oct 03 00:00:00 IST 2020 //wrong date fdate was 03/10/2020
Может кто-нибудь сказать, где я go неправильно?
Ваша основная проблема заключается в том, что ваш шаблон форматирования не соответствует вашим намерениям. Это правильно определено в Ответе Криса и Ответе Арвинда Кумара Авина sh.
Кроме того, у вас есть еще одна проблема. Среди многих проблем с java.util.Date
является то, что его метод toString
на лету применяет текущий часовой пояс JVM по умолчанию при генерации текста для представления содержимого объекта. Это создает иллюзию того, что эта зона хранится внутри объекта. При восприятии значения UT C объекта Date
после настройки на часовой пояс дата может отличаться от даты, указанной в UT C. Это обсуждалось выше.
➥ Никогда не использовать java.util.Date
.
О java .time
java .time Framework встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классов.
Вы можете обмениваться java .time объектами непосредственно с вашей базой данных. Используйте JDB C драйвер , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java .time?