2013-03-26 8 views
10

Czy nie można przetworzyć String sformatowanego za pomocą konkretnej DateTimeFormatter za pomocą LocalDateTime.parse()?Czas Jody - ciąg analizowania wyrzuca java.lang.IllegalArgumentException

test

DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis() 
LocalDateTime ldt = new LocalDateTime() 
String val = ldt.toString(formatter) 
System.out.println(val) //2013-03-26T13:10:46 
// parse() throws java.lang.IllegalArgumentException: Invalid format: "2013-03-26T13:10:46" is too short 
LocalDateTime nldt = LocalDateTime.parse(val, formatter) 
+3

Powiedziałbym, że jest to błąd z JodaTime. Powinien parsować dowolny ciąg z formatem, a formatter jest obiektem DateTimeFormatter, który się nie dzieje. –

Odpowiedz

8

Wystarczy popatrzeć na JavaDoc:

Zwraca podstawową formatowania, które łączy podstawową datę i czas bez Millis, oddzielone „T” (yyyyMMdd'T'HHmmssZ). Przesunięcie strefy czasowej to "Z" dla zera, a dla postaci "± HHmm" dla niezerowej. Analizator składni jest domyślnie ustawiony, dlatego łańcuch czasu 24:00 nie może zostać przeanalizowany.

Kluczem wydaje się być Strefa czasowa offset „Z” na zero, a formy „± GGMM” dla niezerowej. Czas Jody oczywiście oczekuje informacji strefy czasowej dla parse().

I dołączana "Z" krótko przed datą analizowany String i działa lepiej:

DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis(); 
LocalDateTime ldt = new LocalDateTime(); 
String val = ldt.toString(formatter); 
System.out.println(val);  
val += "Z"; 
LocalDateTime nldt = LocalDateTime.parse(val, formatter); 
System.out.println(nldt.toString()); 

wyjściowa wynosi:

2013-03-26T17:50:06 
2013-03-26T17:50:06.000 
2

Formater rzuca również błąd, jeśli formatter.parseLocalDateTime(val) nazywa, czyli co LocalDateTime.parse(...) dzwoni bezpośrednio (tj naiwny call).

A zatem jest to czynnik oczekiwanego formatu - który w tym przypadku wynosi yyyy-MM-dd'T'HH:mm:ssZZ; w zasadzie narzeka, że ​​nie przekroczyłeś strefy czasowej.

Nie wiem, czy faktycznie kwalifikuje się jako "błąd"; w krótkim czasie można oczywiście użyć formatu niestandardowego lub spojrzeć na ISODateTimeFormat.localDateOptionalTimeParser(), który wydaje się być tym, czego potrzebujesz (jest to domyślny analizator składni używany przez LocalDateTime).

Powiązane problemy