Pytanie Nie można uzyskać LocalDateTime z TemporalAccessor podczas analizowania LocalDateTime (Java 8)


Po prostu próbuję przekonwertować ciąg daty na obiekt DateTime w języku Java 8. Po uruchomieniu następujących wierszy:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

Pojawia się 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 tym, co zostało zasugerowane tutaj, ale jestem obsługiwany z wyjątkiem. ja używam JDK-8u25.


76
2017-12-13 00:04


pochodzenie


Proszę spojrzeć na odpowiedź @ZeroOne stackoverflow.com/a/43675230/4914577  również, jeśli szukasz LocalDate. - Peru


Odpowiedzi:


Okazuje się, że Java nie akceptuje czystej daty jako DateTime. Używanie LocalDate zamiast LocalDateTime rozwiązuje problem:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

99
2017-12-13 00:20



Co to jest warte: Miałem ten sam problem, nawet podczas korzystania LocalDate i nie LocalDateTime. Problem polegał na tym, że stworzyłem swoje DateTimeFormatter za pomocą .withResolverStyle(ResolverStyle.STRICT);, więc musiałem użyć wzorca daty uuuuMMdd zamiast yyyyMMdd (np. "rok" zamiast "rok z ery")! - ZeroOne
@ ZeroOne Dziękuję ci "uuuu" jest dokładnie odpowiedź na to pytanie, jeśli działa w trybie ścisłym - Justin Ohms
@ ZeroOne to jest poprawna odpowiedź przy pomocy strict resolver. Dziękuję bardzo! - laughing_man
@ ZeroOne Myślę, że powinieneś opublikować to jako samodzielną odpowiedź. Jest o wiele lepszy niż jakakolwiek inna odpowiedź i łatwiej byłoby go dostrzec niż komentować. - charlie_pl
@charlie_pl OK, dziękuję za pomysł, i gotowe: stackoverflow.com/a/43675230/1333157 ! :) - ZeroOne


Jeśli naprawdę potrzebujesz przekształcić datę w obiekt LocalDateTime, możesz użyć metody LocalDate.atStartOfDay (). Da ci to obiekt LocalDateTime w określonym dniu, z polami godzin, minut i sekund ustawionymi na 0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

37
2017-10-01 11:33



Korekta: ustawiona na w dowolnym momencie na początku tego dnia. - Trejkaz
LocalDateTime.from wydaje się niepotrzebne, jako atStartOfDay() już zwraca LocalDateTime. - Dariusz
scala: val time = LocalDate.parse ("20171220", DateTimeFormatter.ofPattern ("rrrrMMdd")). atStartOfDay.format (DateTimeFormatter.ofPattern ("rrrr-MM-dd GG: mm: ss")) - Woody Sun


Jest to naprawdę niejasny i niepomocny komunikat o błędzie. Po wielu próbach i błędach znalazłem to LocalDateTime da powyższy błąd, jeśli nie spróbujesz przeanalizować czasu. Używając LocalDate zamiast tego działa bez błędów.

Jest to słabo udokumentowane, a powiązany wyjątek jest bardzo niepomocny.


26
2018-01-26 23:33





Za to, co jest warte, jeśli ktokolwiek powinien przeczytać ponownie ten temat (jak ja), poprawna odpowiedź będzie DateTimeFormatter definicja, np .:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

Należy ustawić opcjonalne pola, jeśli się pojawią. Reszta kodu powinna być dokładnie taka sama.


22
2017-09-25 09:11



Jest to prawdziwe rozwiązanie uniwersalne, na przykład dla takiej metody: Long getFileTimestamp (plik String, Pattern Pattern, DateTimeFormatter dtf, int group); Tutaj masz różne wzory i DateTimeFormetter, w / i określony czas w / o. - toootooo
Czy to może być pole statyczne? Nie znalazłem w Javadoc, że instancja stworzona w ten sposób jest wątkowo bezpieczna - Kamil Roman


Rozszerzanie odpowiedź retrografii..: Miałem ten sam problem, nawet podczas korzystania LocalDate i nie LocalDateTime. Problem polegał na tym, że stworzyłem swoje DateTimeFormatter za pomocą .withResolverStyle(ResolverStyle.STRICT);, więc musiałem użyć wzorca daty uuuuMMdd zamiast yyyyMMdd (np. "rok" zamiast "rok z ery")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(To rozwiązanie było pierwotnie komentarzem do odpowiedzi retrograficznej, ale zachęcano mnie, aby opublikować go jako samodzielną odpowiedź, ponieważ najwyraźniej działa bardzo dobrze dla wielu osób.)


14
2018-04-28 08:10



Dzięki @ZeroOne za odpowiedź. Nie wiem, dlaczego programiści programu java.time.DateTimeFormatterBuilder wolą mieć "uuuu" zamiast "yyyy" - Peru


Jeśli data String nie zawiera żadnej wartości godzin, minut i itd., Nie można bezpośrednio przekonwertować tej wartości na LocalDateTime. Możesz go przekonwertować tylko na LocalDate, ponieważ ciąg znaków tylko  przedstawiać  rok, miesiąc i data składniki byłyby właściwe.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

W każdym razie możesz przekonwertować to na LocalDateTime.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

5
2018-03-12 09:38





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:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

Okazało się, że dzieje się tak dlatego, że używam wzoru godzinowego 12 godzin na godzinę, zamiast na 24 godzinny wzór.

Zmiana godziny na 24-godzinny wzór za pomocą dużego H powoduje jego usunięcie:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

4
2018-05-17 19:18



Ta odpowiedź uratowała mi dzień - pedram bashiri