java.время.формат.Исключение DateTimeParseException: Текст «13/11/2020» не удалось проанализировать по индексу 2

#java #datetime #java-8 #localdate

Вопрос:

Я столкнулся с проблемой преобразования строки в LocalDateTime и добавления 3 месяцев к текущему месяцу.

Это мой код:

 String str = "13/11/2020";
LocalDateTime dateTime = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
dateTime.plusMonths(3);      //  => output: 13/02/2021
System.out.println(dateTime);
 

Но когда я запускаю его, я получаю следующее исключение:

 java.time.format.DateTimeParseException: Text '13/11/2020' could not be parsed at index 2
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[?:1.8.0_144]
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) ~[?:1.8.0_144]
at java.time.LocalDateTime.parse(LocalDateTime.java:492) ~[?:1.8.0_144]
 

Как я могу решить эту проблему ? Большое спасибо

Комментарии:

1. Вы используете шаблон dd-MM-yyyy для анализа String шаблона dd/MM/yyyy dd/MM/uuuu , соответствующего…. Отрегулируйте шаблон DateTimeFormatter.ofPattern(...) соответствующим образом. Индекс 2 находится - в вашем String и / в вашем шаблоне.

2. Ваш шаблон не соответствует вашим вводным данным. Почему вы ожидаете, что это сработает? Как вы думаете "dd-MM-yyyy" , для чего он используется?

3. да, итак, как я могу выполнить синтаксический анализ в формате 13-11-2020 ?

4. «Разбор» означает чтение. Это не означает обращение. Если вы хотите конвертировать, вам нужно сначала проанализировать его с помощью «дд/ММ/гггг», а ЗАТЕМ отформатировать с помощью «дд-ММ-гггг».

Ответ №1:

Множество проблем:

  1. Ваша строка выглядит как LocalDate и LocalDateTime , она не содержит части времени
  2. Шаблон, который вы используете, не имеет того же формата, что и ваша строка, она должна быть dd/MM/yyyy или dd/MM/uuuu нет dd-MM-yyyy

Чтобы разобрать вашу строку, вам нужно:

 LocalDate date = LocalDate.parse(str, DateTimeFormatter.ofPattern("dd/MM/uuuu"));
dateTime = dateTime.plusMonths(3);
 

Или , если вы хотите LocalDateTime , то вы можете использовать DateTimeFormatterBuilder с 0 в течение часов, минут и секунд:

 DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("dd/MM/uuuu")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .toFormatter();
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
dateTime = dateTime.plusMonths(3);
 

и результат будет таким: 2021-02-13T00:00

Примечание: dateTime.plusMonths(3) это immutable так, чтобы изменить значение, вы должны присвоить новое значение переменной.

Ответ №2:

В вашем коде есть несколько проблем:

  1. Вы используете неправильный шаблон формата. Если строка даты содержит косые черты, то же самое следует сделать и со строкой шаблона: DateTimeFormatter.ofPattern("dd/MM/yyyy") .
  2. Если дата не включает время, используйте LocalDate вместо LocalDateTime .
  3. plusMonths Результат должен быть присвоен новой переменной, чтобы получить обновленный экземпляр.
  4. DateTimeFormatter Необходимо использовать при печати ожидаемого результата 13/02/2021 , чтобы вы могли использовать один и тот же экземпляр форматера:
     String str = "13/11/2020";
    var dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    var dateTime = LocalDate.parse(str, dateTimeFormatter);
    var newDateTime = dateTime.plusMonths(3); // => output: 13/02/2021
    System.out.println(newDateTime.format(dateTimeFormatter));