Не удается преобразовать строку в 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.Parsed

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


person mthmulders    schedule 24.07.2015    source источник
comment
Вы должны выбрать yyyy вместо YYYY   -  person kv-prajapati    schedule 24.07.2015


Ответы (2)


Для года вы должны использовать букву y в нижнем регистре:

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

Прописная буква Y обозначает год недели. Дополнительные сведения см. В javadoc DateTimeFormatter.

person Jens    schedule 24.07.2015
comment
Просто из любопытства, как сообщение об ошибке связано с тем фактом, что Y соответствует недельному году, а y соответствует году? - person mthmulders; 24.07.2015
comment
В сообщении об ошибке написано {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [MONDAY, 4]] = 2015}, это означает, что он проанализировал 1 из вашей входной строки как DayOfMonth (поскольку вы использовали d в своем шаблоне), 7 было проанализировано как MonthOfYear (из-за M в вашем шаблоне), а 2015 понимался как WeekBasedYear (он же Weekyear) из-за Y в вашем шаблоне - person Kejml; 24.07.2015
comment
@mthmulders Иногда сообщения об исключениях - отстой. Конечно, это исключение на самом деле не так уж и плохо, и оно говорит вам, что оно пыталось проанализировать YYYY как. Я поискал java datetimeformatter weekbasedyear, и первый результат привел меня к здесь, в котором перечислены типы идентификаторов и что они имеют в виду. - person Chris Cirefice; 24.07.2015

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

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

Unable to obtain LocalDate from TemporalAccessor

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

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 (значение по умолчанию)

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

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

person JodaStephen    schedule 24.07.2015