不应该使用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)
答案 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
使用的默认解析器)。