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

Не удается разобрать String в LocalDate (Java 8)

Мой ввод представляет собой строковое представление даты в формате "01-07-2015" на 1 июля 2015 года. Я пытаюсь проанализировать это в переменной java.time.LocalDate:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY");
final String input = "01-07-2015";
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT);

На основе DateTimeFormatter JavaDoc я ожидаю, что это сработает. Однако меня приветствует очень дружелюбное и полезное сообщение:

Вызвано: java.time.DateTimeException: невозможно получить LocalDate из TemporalAccessor: {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [MONDAY, 4]] = 2015}, ISO типа java.time.format. Проанализированные

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

4b9b3361

Ответ 1

В течение года вы должны использовать нижний регистр y:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");

Верхний регистр Y используется для недельного периода. Подробнее см. javadoc of DateTimeFormatter.

Ответ 2

Ответ на вопрос - использовать 'y' не 'Y'.

Чтобы объяснить сообщение об ошибке, разрешите его разложить:

Unable to obtain LocalDate from TemporalAccessor

Это говорит о том, что он не может создать LocalDate (что было запрошено) из TemporalAccessor (низкоуровневый интерфейс, который предоставляет доступ к hashmap в поля даты/времени).

of type java.time.format.Parsed

Это говорит о том, что объект, переданный в метод, имел тип java.time.format.Parsed. Это стандартный тип вывода синтаксического анализа и содержит всю информацию, которая была проанализирована.

{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO

Это форма toString() объекта java.time.format.Parsed, возникшая в результате разбора. Говорят, что было проанализировано четыре вещи:

  • DayOfMonth=1, день месяца проанализирован со значением 1
  • MonthOfYear=7, месяц за годом проанализировал значение 7
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015, в течение недели по-разному анализируется значение 2015
  • ISO, который является системой календаря ISO (значение по умолчанию)

Так как невозможно создать a LocalDate из комбинации DayOfMonth + MonthOfYear + WeekBasedYear, генерируется исключение.

Обратите внимание, что часть [WeekFields[MONDAY,4]] относится к тому факту, что существует множество различных способов определения недели, в начале недели в США, но в стандарте ISO и в ЕС они начинаются в понедельник.