Преобразование строки в localDateTime не работает должным образом и получает исключения при синтаксическом анализе

Попытка преобразовать строку в localDateTime и посмотреть, старше ли дата года. Я знаю, что это должно работать, но это не работает. Получение исключений синтаксического анализа по индексу 'i'

LocalDateTime currentTimeLastYear = LocalDateTime.now().minusYears(1);

String pattern = "MM/dd/yyyy'T'HH:mm:s";

// ex "8/30/2019T15:51:5"
String queryToDate = query.getDateRange().getToDate();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDateTime localDateTime = LocalDateTime.parse(queryToDate, formatter);
System.out.println(localDateTime);

if (localDateTime.isBefore(currentTimeLastYear)) {
    return true;
}    

Формат строки даты явно не MM/dd/yyyy. Две M означают, что если месяц является однозначной цифрой, впереди будет 0.

Sweeper 15.12.2020 05:30

Используйте String pattern = "M/dd/yyyy'T'HH:mm:s";

Scary Wombat 15.12.2020 05:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Если месяц 8 вместо 08, используйте M вместо MM.

Это объясняется в документации Javadoc:

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

String input = "8/23/2021T1:23:7"
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uuuu'T'H:m:s" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

Посмотрите, как этот код запускается в прямом эфире на IdeOne.com.

ldt.toString() = 2021-08-23T01:23:07

Совет: информируйте издателя ваших данных о соответствии ISO 8601 и всегда используйте нулевой отступ. Ваш ввод, похоже, использует неудачную попытку ISO 8601.

Понятно. Я довольно новичок в java. Быстрый вопрос, если вы не возражаете: использование одной буквы работает, как вы объяснили, но будут ли исключены миллисекунды, если они присутствуют, и шаблон «M/d/uuuu'T'H:m:s»: 2020-12- 14T23:38:46.269

Gunther 15.12.2020 05:49

@Gunther Вы не упомянули ни доли секунды в своем вопросе. Вы действительно должны привести пример ввода там.

Basil Bourque 15.12.2020 05:50

Попробую сначала поискать, а потом спрашивать. Мне было просто любопытно. Вы ответили на мой изначальный вопрос. Спасибо

Gunther 15.12.2020 05:54

@Gunther Ищите перед публикацией. Большинство основных вопросов об обработке даты и времени уже неоднократно задавались и на них отвечали в Stack Overflow.

Basil Bourque 15.12.2020 05:57

Другие вопросы по теме