#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:
Множество проблем:
- Ваша строка выглядит как
LocalDate
иLocalDateTime
, она не содержит части времени - Шаблон, который вы используете, не имеет того же формата, что и ваша строка, она должна быть
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:
В вашем коде есть несколько проблем:
- Вы используете неправильный шаблон формата. Если строка даты содержит косые черты, то же самое следует сделать и со строкой шаблона:
DateTimeFormatter.ofPattern("dd/MM/yyyy")
. - Если дата не включает время, используйте
LocalDate
вместоLocalDateTime
. plusMonths
Результат должен быть присвоен новой переменной, чтобы получить обновленный экземпляр.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));