2015-07-24 9 views
18

Moje dane wejściowe to ciąg znaków reprezentujący datę w formacie "01-07-2015" z 1 lipca 2015 r. Próbuję przeanalizować tę zmienną w zmiennej java.time.LocalDate :Nie można zanalizować ciągu znaków String na wartość LocalDate (Java 8)

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

Na podstawie DateTimeFormatter JavaDoc, oczekiwałbym, że to zadziała. Jednak jestem witany z bardzo przyjazny i pomocny wiadomości:

spowodowane: java.time.DateTimeException: Nie można uzyskać LOCALDATE z TemporalAccessor: {DzieńMiesiąca = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [PONIEDZIAŁEK , 4]] = 2015}, ISO typu java.time.format.Parsed

Nie bardzo rozumiem, co mówi mi ten wyjątek. Czy ktoś może mi wyjaśnić, co się dzieje?

+9

Powinieneś wybrać 'yyyy' zamiast' YYYY' – adatapost

Odpowiedz

25

W roku trzeba wykorzystać małą Y:

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

Wielkie Y jest używany weekyear. Aby uzyskać więcej informacji, patrz javadoc of DateTimeFormatter.

+3

Po prostu z ciekawości, w jaki sposób komunikat o błędzie odnosi się do faktu, że 'Y' jest dla _weekyear_, a' y' dla _year_? – mthmulders

+4

Komunikat o błędzie: {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [MONDAY, 4]] = 2015}, oznacza, że ​​przeanalizował 1 z Twojego ciągu wejściowego jako DayOfMonth (ponieważ użyłeś "d" we wzorcu), 7 został sparsowany jako MonthOfYear (ze względu na "M" w twoim wzorze), a rok 2015 był rozumiany jako WeekBasedYear (inaczej jako weekyear), ponieważ "Y" w twoim wzorze – Kejml

+0

@mthmbersy Czasami [wyjątki wiadomości suck] (http: //programmers.stackexchange .pl/questions/278949/why-do-many-exception-messages-not-contain-useful-details). To prawda, że ​​ten wyjątek nie jest aż tak zły, i mówi ci, co próbował sparsować "YYYY" jako. Sprawdziłem [java datetimeformatterbasedyear] (https://www.google.com/search?q=java+datetimeformatter+weekbasedyear) i pierwszy wynik doprowadził mnie [tutaj] (https://docs.oracle.com/javase /8/docs/api/java/time/format/DateTimeFormatter.html), który zawiera listę typów identyfikatorów i ich znaczenie. –

12

Odpowiedź na to pytanie jest użycie 'Y' nie 'Y'.

Aby wyjaśnić komunikat o błędzie, pozwala rozkładać go:

Unable to obtain LocalDate from TemporalAccessor

Ten mówi, że nie można utworzyć LocalDate (co było wymagane) od TemporalAccessor (interfejs niskiego poziomu, który zapewnia hashmap- jak dostęp do pól daty/czasu).

of type java.time.format.Parsed

Ten mówi, że obiekt przekazany do metody był typu java.time.format.Parsed. Jest to standardowy typ wyjściowy analizowania i zawiera wszystkie informacje, które zostały przeanalizowane.

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

to forma toString() obiektu java.time.format.Parsed który jest wynikiem analizy. Jest powiedzenie, że cztery rzeczy były analizowane:

  • DayOfMonth=1, dzień, z miesiąca analizowany z wartością 1
  • MonthOfYear=7, miesiąc, z roku analizowany z wartością 7
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015 The tydzień oparte roku analizowana o wartości 2015
  • ISO, która jest system kalendarzowy ISO (wartość domyślna)

Ponieważ nie jest możliwe wyprodukowanie LocalDate z kombinacji DayOfMonth + MonthOfYear + WeekBasedYear, zgłoszony zostanie wyjątek.

Należy zauważyć, że część [WeekFields[MONDAY,4]] odnosi się do faktu, że istnieje wiele różnych sposobów definiowania tygodnia, w USA rozpoczynają się tygodnie w niedzielę, ale w normie ISO i UE zaczynają się w poniedziałek.

Powiązane problemy