2015-06-10 11 views
15

udało mi się analizować String do LocalDate obiektu:JDK8: nie można analizować Localtime

DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy"); 
LocalDate d=LocalDate.parse("26 08 1984",f1); 
System.out.println(d); //prints "1984-08-26" 

Ale nie mogę zrobić to samo z LocalTime. Ten fragment kodu:

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm"); 
LocalTime t=LocalTime.parse("11 08",f2); //exception here 
System.out.println(t); 

rzuca DateTimeParseException:

Exception in thread "main" java.time.format.DateTimeParseException: Text '11 08' could not be parsed: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type java.time.format.Parsed 
    at java.time.format.DateTimeFormatter.createError(Unknown Source) 
    at java.time.format.DateTimeFormatter.parse(Unknown Source) 
    at java.time.LocalTime.parse(Unknown Source) 
    at com.mui.cert.Main.<init>(Main.java:21) 
    at com.mui.cert.Main.main(Main.java:12) 
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type java.time.format.Parsed 
    at java.time.LocalTime.from(Unknown Source) 
    at java.time.LocalTime$$Lambda$15/1854731462.queryFrom(Unknown Source) 
    at java.time.format.Parsed.query(Unknown Source) 
    ... 4 more 

Co robię źle?

Odpowiedz

14

przypadku korzystania z określonego formatu, zgodnie to API:

Łańcuch musi reprezentować poprawny czas i jest analizowany przy użyciu DateTimeFormatter.ISO_LOCAL_TIME.

hh mm 

przez 24 godziny musi być

HH mm 

lub 12h

kk mm 

obsługiwanego formaty musi mieć to warunki:

  • dwie cyfry godzinna dnia. To jest wstępnie wyściełane przez zero, aby zapewnić dwie cyfry.
  • Okrężnica
  • Dwie cyfry na minutę. To jest wstępnie wyściełane przez zero, aby zapewnić dwie cyfry.
  • Jeśli sekunda minutowa nie jest dostępna, format jest kompletny.
  • Okrężnica
  • Dwie cyfry na sekundę. To jest wstępnie wyściełane przez zero, aby zapewnić dwie cyfry.
  • Jeśli nano-sekunda jest równa zero lub nie jest dostępna, format jest kompletny.
  • Kropka dziesiętna
  • Jedna do dziewięciu cyfr dla nano-of-sekundy. Ile cyfr zostanie wyprowadzonych zgodnie z wymaganiami.
+0

Czy możesz połączyć zasoby? –

+1

Pewnie ... gotowe! :) –

+3

To ciekawe, że mogę bez końca narzucać porządek żywiołów ... –

1

Trzeba użyć kapitału HH w strukturze

DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm"); 

czy to zrobić, dla clock-hour-of-am-pm trzeba go określić.

ten powinien również pracować

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here 
+0

działa ... ale dlaczego? 'h -> clock-hour-of-am-pm' też powinno działać! –

+1

Myślę, że część "am-pm" jest ważna - może odnosić się do dwóch odrębnych Czasów Własnych (jeden dla mnie i jeden dla pm) – Deltharis

2

Korzystając DateTimeFormatter.ofPattern("kk mm"); dla 12 godzinnym lub DateTimeFormatter.ofPattern("HH mm") o 24 godzinnym

Jeśli chcesz analizować razem z hh trzeba połączyć go wih a gdzie można zdefiniować AM lub PM:

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t = LocalTime.parse("11 08 AM", f2); 
2

W tym przypadku Unable to obtain LocalTime from TemporalAccessor oznacza, że ​​nie można określić, jak daleko w ciągu dnia dany ciąg oznacza to, że nie ma wystarczających informacji, aby skonstruować LocalTime. Za kulisami, kod wygląda mniej więcej tej rozszerzonej wersji Java 8 (co daje podobny błąd):

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm"); 
TemporalAccessor temporalAccessor = f2.parse("11 08"); 
LocalTime t = temporalAccessor.query(LocalTime::from); 
System.out.println(t); 

Dokumentacja LocalTime::from mówi

Konwersja używa TemporalQueries.localTime() zapytanie, który polega na wyodrębnianiu pola NANO_OF_DAY.

Twój błąd jest informacją, że TemporalAccessor ma tylko dwa pola, z których żadna nie jest polem NANO_OF_DAY. Minimalne dopuszczalne wzorce do pobierania LocalTime użyciu DateTimeFormatter są:

DateTimeFormatter.ofPattern("ha"); 
DateTimeFormatter.ofPattern("Ka"); 
DateTimeFormatter.ofPattern("ah"); 
DateTimeFormatter.ofPattern("aK"); 
DateTimeFormatter.ofPattern("k"); 
DateTimeFormatter.ofPattern("H"); 

Twój wzór musi zawierać co najmniej jeden z tych ciągów, aby uzyskać pole NANO_OF_DAY w wewnętrznej TemporalAccessor z którego LocalTime może być skonstruowana.

Powiązane problemy