Сравнение даты и времени дает неверный результат

Этот код должен дать false, поскольку 11:49 предшествует 12:07. Но код возвращает true.

Если я изменяю 12:07 на 13:00, это дает ложь, что правильно. Я понятия не имею, что не так с 12:07. Я что-то упускаю? Я также пробовал методы compareTo и giveTime с теми же результатами.

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 12:07")));

person Bits Please    schedule 01.06.2018    source источник
comment
Я подозреваю, что 12:07 — это 00:07, всего семь минут после полуночи. Вам придется указать AM или PM или найти другой способ сообщить системе, что некоторые даты следует считать PM.   -  person markspace    schedule 01.06.2018
comment
Я рекомендую вам избегать класса SimpleDateFormat. Он не только давно устарел, но и заведомо хлопотный. Сегодня у нас намного лучше java.time, современный API даты и времени Java.   -  person Ole V.V.    schedule 04.06.2018


Ответы (4)


hh (диапазон 1-12), 12:07 анализируется как 00:07:

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
System.out.println(format.parse("5/31/2018 00:07").equals(format.parse("5/31/2018 12:07")));  // true

Вместо этого используйте HH (диапазон 0-23), это даст желаемый результат:

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm");
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 12:07"))); // false
person xingbin    schedule 01.06.2018

«ЧЧ» — это 12-часовой формат времени, поэтому «12:07» интерпретируется как «00:07». Вы, вероятно, хотите "HH". См. https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

person JustinKSU    schedule 01.06.2018

Вы что-то упустили в формате.

Формат чч соответствует часу в am/pm (1-12), как вы могли видеть в документации: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Если вы запустите следующее:

System.out.println(format.parse("5/31/2018 12:07"));

Ты получишь:

Thu May 31 00:07:00 ART 2018

Вот почему ты становишься правдой.

Вы должны изменить формат времени на: ЧЧ:мм. Этого будет достаточно.

person Martin Margonari    schedule 01.06.2018

В дополнение к другим ответам вы можете упростить поиск таких скрытых проблем, вызвав setLenient(false) для вашего объекта SimpleDateFormat.

По умолчанию процесс синтаксического анализа мягкий, т. е. синтаксический анализ выполняется успешно, даже если String не полностью соответствует шаблону.

Вы написали, что запись "13" в часовой части работала нормально, что добавило вам путаницы. Если для снисходительного задано значение false, parse выдаст ParseException, поскольку "13" не соответствует "hh", что делает его более очевидным. что ваш String не соответствует шаблону.

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
format.setLenient(false);
// Next line will throw a ParseException, as the second call to parse now fails
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 13:07")));
person Max Vollmer    schedule 01.06.2018
comment
Он выдает ParseException (а не NullPointerException) в вашем случае попытки разобрать 13:07, но не в случае 12:07, как в вопросе. Так что даже небольшое улучшение ИМХО не совсем к делу. Для сравнения, современный DateTimeFormatter из java.time всегда будет выдавать исключение, если вы попытаетесь получить дату и время, а не только после 13:00. Я считаю, что это намного полезнее. - person Ole V.V.; 04.06.2018
comment
@ОлеВ.В. Вы правы, я думал о public Date parse(String text, ParsePosition pos), который возвращает null при ошибке. - person Max Vollmer; 04.06.2018