Joda时间 - 解析字符串抛出java.lang.IllegalArgumentException

时间:2013-03-26 16:15:55

标签: java jodatime date-formatting date-parsing

不应该使用String解析使用特定DateTimeFormatter格式化的LocalDateTime.parse()吗?

测试

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) 

2 个答案:

答案 0 :(得分:8)

查看JavaDoc

  

返回一个基本格式化程序,它结合了一个没有毫秒的基本日期和时间,用'T'(yyyyMMdd'T'HHmmssZ)分隔。对于零,时区偏移为'Z',对于非零,时区偏移为'±HHmm'。默认情况下,解析器是严格的,因此无法解析时间字符串24:00。

这里的关键似乎是时区偏移为'Z'为零,而'±HHmm'为非零。 Joda Time显然希望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

答案 1 :(得分:2)

如果formatter.parseLocalDateTime(val)被调用,格式化程序也会抛出错误,这就是LocalDateTime.parse(...)直接调用的内容(即,天真的调用)。

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

我不知道这是否真的有资格作为一个'错误&#39 ;;在短期内,显然可以使用自定义格式,或者查看ISODateTimeFormat.localDateOptionalTimeParser(),这似乎是您想要的(它是LocalDateTime使用的默认解析器)。