2013-03-26 28 views
10

Không phải là String được định dạng với một số DateTimeFormatter cụ thể có thể được phân tích cú pháp bằng cách sử dụng LocalDateTime.parse()?Thời gian Joda - Chuỗi phân tích cú pháp ném java.lang.IllegalArgumentException

thử nghiệm

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

Tôi có thể nói đây là một lỗi với JodaTime. Nó sẽ phân tích cú pháp bất kỳ chuỗi nào có định dạng cũng như trình định dạng là đối tượng của DateTimeFormatter không xảy ra. –

Trả lời

8

Có một cái nhìn tại JavaDoc:

Trả về một định dạng cơ bản mà kết hợp một ngày cơ bản và thời gian mà không millis, cách nhau bằng một 'T' (yyyyMMdd'T'HHmmssZ). Độ lệch múi giờ là 'Z' đối với số không và dạng '± HHmm' cho số không khác. Trình phân tích cú pháp theo mặc định, do đó chuỗi thời gian 24:00 không thể được phân tích cú pháp.

Mấu chốt ở đây có vẻ là Các múi giờ bù đắp là 'Z' cho không, và có dạng '± hhmm' cho khác không. Thời gian Joda rõ ràng dự kiến ​​thông tin múi giờ cho parse().

tôi nối "Z" đến nay chuỗi phân tích cú pháp của bạn và nó hoạt động tốt hơn:

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()); 

Output là:

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

Các định dạng cũng ném lỗi nếu formatter.parseLocalDateTime(val) được gọi, đó là những gì LocalDateTime.parse(...) đang kêu gọi trực tiếp (ví dụ, các cuộc gọi ngây thơ).

Vì vậy, sau đó, đó là một yếu tố của định dạng được mong đợi - trong trường hợp này là yyyy-MM-dd'T'HH:mm:ssZZ; về cơ bản, nó phàn nàn rằng bạn đã không vượt qua một múi giờ.

Tôi không biết liệu điều này có thực sự đủ tiêu chuẩn là 'lỗi' hay không; trong ngắn hạn, rõ ràng là một định dạng tùy chỉnh có thể được sử dụng hoặc xem ISODateTimeFormat.localDateOptionalTimeParser(), dường như là những gì bạn muốn (đó là trình phân tích cú pháp mặc định được sử dụng bởi LocalDateTime).