Po prostu próbuję przekonwertować ciąg daty na obiekt DateTime w Javie 8. Po uruchomieniu następujących wierszy:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
Otrzymuję następujący błąd:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
Składnia jest identyczna z tą, która została tu zasugerowana , ale obsługiwany jestem z wyjątkiem. Używam JDK-8u25
.
java
datetime
java-8
datetime-format
retrografia
źródło
źródło
LocalDate
i nieLocalDateTime
. Problem polegał na tym, że stworzyłemDateTimeFormatter
użycie.withResolverStyle(ResolverStyle.STRICT);
, więc musiałem użyć wzorca datyuuuuMMdd
zamiastyyyyMMdd
(tj. „Rok” zamiast „roku ery”)!Jeśli naprawdę potrzebujesz przekształcić datę w obiekt LocalDateTime, możesz użyć metody LocalDate.atStartOfDay (). W ten sposób otrzymasz obiekt LocalDateTime o określonej dacie, z polami godziny, minuty i sekundy ustawionymi na 0:
źródło
LocalDateTime.from
wydaje się niepotrzebne, ponieważatStartOfDay()
już wracaLocalDateTime
.Bo cóż by było, gdyby ktoś jeszcze raz przeczytał ten temat (tak jak ja) poprawna odpowiedź byłaby w
DateTimeFormatter
definicji, np:Należy ustawić opcjonalne pola, jeśli się pojawią. A reszta kodu powinna być dokładnie taka sama.
źródło
parseDefaulting
wywołaniuappendPattern
. W przeciwnym razie to daDateTimeParseException
.To jest naprawdę niejasny i nieprzydatny komunikat o błędzie. Po wielu próbach i błędach stwierdziłem, że
LocalDateTime
wystąpi powyższy błąd, jeśli nie spróbujesz przeanalizować czasu. UżywającLocalDate
zamiast tego, działa bez błędów.Jest to słabo udokumentowane, a powiązany wyjątek jest bardzo nieprzydatny.
źródło
Poszerzenie odpowiedzi na temat retrografii …: Miałem ten sam problem, nawet gdy go używałem,
LocalDate
a nieLocalDateTime
. Problem polegał na tym, że stworzyłemDateTimeFormatter
użycie.withResolverStyle(ResolverStyle.STRICT);
, więc musiałem użyć wzorca datyuuuuMMdd
zamiastyyyyMMdd
(tj. „Rok” zamiast „roku ery”)!(To rozwiązanie było początkowo komentarzem do odpowiedzi retrograficznej, ale zachęcono mnie do opublikowania go jako samodzielnej odpowiedzi, ponieważ najwyraźniej działa naprawdę dobrze dla wielu ludzi.)
źródło
Dla każdego, kto wylądował tutaj z tym błędem, tak jak ja:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Pochodzi z następującej linii:
Okazało się, że to dlatego, że użyłem wzoru 12-godzinnego na godzinę 0, zamiast wzoru 24-godzinnego.
Zmiana wzoru godzinowego na 24-godzinny za pomocą dużego H rozwiązuje ten problem:
źródło
Jeśli ciąg daty nie zawiera żadnej wartości dla godzin, minut itp., Nie można bezpośrednio przekonwertować tego na plik
LocalDateTime
. Możesz go przekonwertować tylko na aLocalDate
, ponieważ łańcuch reprezentuje tylko składniki roku, miesiąca i daty , które byłoby poprawne.W każdym razie możesz przekonwertować to na
LocalDateTime
.źródło
yyyy-mm-dd
, jaki powinienyyyy-MM-dd
.Spróbuj tego:
Możesz dodać dowolny format. To działa dla mnie!
źródło
To działa dobrze
wynik:
źródło