Не удается разобрать 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. Проанализированные
Я действительно не понимаю, что это исключение говорит мне. Может ли кто-нибудь объяснить мне, что происходит не так?
Ответы
Ответ 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 и в ЕС они начинаются в понедельник.