Подтвердить что ты не робот

DateTimeFormatterBuilder с указанными конфликтами parseDefaulting для поля YEAR

У меня есть следующий форматтер:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMM")
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear())
        .toFormatter()
        .withZone(ZoneId.systemDefault());

Я пытаюсь разобрать строку "201505"

System.out.println(ZonedDateTime.parse("201505", formatter));

и генерирует исключение:

Вызвано: java.time.DateTimeException: обнаружен конфликт: Год 2016 отличается от 2015 года

Он работает, если я прокомментирую настройку значения по умолчанию для YEAR.

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

Я использую это неправильно, может ли кто-нибудь сказать мне, есть ли другой способ определить значения по умолчанию для полей, которые могут отсутствовать в шаблоне?

4b9b3361

Ответ 1

Проблема заключается в том, что буква шаблона "y" относится к ChronoField.YEAR_OF_ERA, а не к ChronoField.YEAR. Просто измените последнюю строку parseDefaulting:

.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear())

и он должен работать.