2013-03-26 41 views
10

不应该与特定DateTimeFormatter格式化的String能够使用LocalDateTime.parse()解析?乔达时间 - 解析字符串抛出java.lang.IllegalArgumentException异常

测试

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

我会说这是JodaTime的错误。它应该解析任何格式的字符串,格式化程序也是不会发生的DateTimeFormatter的对象。 – 2013-03-26 16:48:43

回答

8

看一看的JavaDoc

返回由一个基本的日期和时间不米利斯,由“T”(yyyyMMdd'T'HHmmssZ)分开的基本格式。时区偏移量为零时为“Z”,非零时区为“±HHmm”。解析器默认是严格的,因此时间字符串24:00不能被解析。

这里的关键似乎是时区偏移量为“Z”为零,和形式的“±HHMM”的非零。 Joda时间显然预计时区信息为parse()

我追加"Z"您解析日期字符串,它工作得更好:

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

输出是:

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

格式化也将引发formatter.parseLocalDateTime(val)被称为错误,这是什么LocalDateTime.parse(...)直接调用(即天真的调用)。

因此,这是预期格式的一个因素 - 在这种情况下是yyyy-MM-dd'T'HH:mm:ssZZ;基本上,这是抱怨你没有通过时区。

我不知道这是否真的符合'错误'的条件;在短期内,显然可以使用自定义格式,或者查看ISODateTimeFormat.localDateOptionalTimeParser(),这似乎是您想要的(这是LocalDateTime使用的默认解析器)。