Дата сравнения java провал - PullRequest
       9

Дата сравнения java провал

0 голосов
/ 28 октября 2018

при сравнении будущих дней происходит сбой в Java. Посмотрите на код, если вы можете

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
Date date = dateFormat.parse("2258-11-01");
Date date1 =  dateFormat.parse("2258-10-31");
System.out.println(date.after(date1));

Вывод: false

Кто-нибудь знает, почему это не работает?

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы должны использовать заглавную ММ для месяца, иначе он не будет анализироваться так, как вы хотите.

new SimpleDateFormat("yyyy-MM-dd");
0 голосов
/ 29 октября 2018

tl; dr

Используйте современные java.time классы для анализа ваших строк , которые, как оказалось, соответствуют стандартуформат .

LocalDate.parse( "2258-11-01" )
.isAfter( 
    LocalDate.parse( "2258-10-31" ) 
)

true

Подробности

Как уже упоминалось, шаблон форматирования чувствителен к регистру, а ваш - неправильный.

Другая проблема: вы неуместно сжимаете значение только для даты в тип, предназначенный для даты с временем суток в UTC.

Кроме того, вы используете ужасную старую датуклассы, которые были вытеснены несколько лет назад современными java.time классами.

Ваши входные строки соответствуют превосходному стандарту ISO 8601 .Классы java.time по умолчанию используют эти форматы при разборе / генерации строк.Поэтому не нужно даже беспокоиться об определении шаблона форматирования.

LocalDate ld1 = LocalDate.parse( "2258-11-01" ) ;
LocalDate ld2 = LocalDate.parse( "2258-10-31" ) ;

Сравните.

boolean isAfter = ld1.isAfter( ld2 ) ;  // true

Все это уже много раз уже освещалось в Переполнении стека.Пожалуйста, научитесь тщательно искать переполнение стека перед публикацией.


О java.time

java.time Фреймворк встроен в Java 8 и выше.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

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

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 28 октября 2018

Формат m представляет минуту в часе. Вы, вероятно, хотели использовать M, представляющий месяц в году:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
...