Java 8 LocalDate не будет анализировать действительную строку даты

Ява 8 здесь. У меня есть следующий код:

final String createdDateStr = "20110920";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYYMMdd");
final LocalDate localDate = LocalDate.parse(createdDateStr, formatter);

Во время выполнения я получаю следующее исключение:

java.time.format.DateTimeParseException: Text '20110920' could not be parsed at index 0

    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.

...выбрасывается из вызова LocalDate.parse(...). Что не так с парсером?!


person hotmeatballsoup    schedule 20.09.2018    source источник
comment
Точно. Полное сообщение об ошибке: Exception in thread "main" java.time.format.DateTimeParseException: Text '20110920' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=9, WeekBasedYear[WeekFields[SUNDAY,1]]=2011, DayOfMonth=20},ISO of type java.time.format.Parsed WeekBasedYear подсказывает, что формат неверен. ОП хотел y, но написал Y. Вероятно, распространенная ошибка. :)   -  person Ray Toal    schedule 20.09.2018
comment
Та же проблема, что и в Синтаксический анализ строки в формате даты в java по умолчанию устанавливает дату как 1 и месяц как январь, хотя симптом не тот же. Да, распространенная ошибка, @RayToal.   -  person Ole V.V.    schedule 21.09.2018


Ответы (2)


Пример из документации:

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(text, formatter);

Вы должны использовать "yyyyMMdd" вместо "YYYYMMdd". Разница между Y и y была упомянута здесь.

person Andrew Tobilko    schedule 20.09.2018

Нет необходимости указывать формат вручную. Он уже встроен.

    final String createdDateStr = "20110920";
    final DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;
    final LocalDate localDate = LocalDate.parse(createdDateStr, formatter);
    System.out.println(localDate);

Это выводит:

2011-09-20

person Ole V.V.    schedule 21.09.2018