11

不应该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) 
4

2 回答 2

9

看看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
于 2013-03-26T16:54:39.123 回答
2

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

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

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

于 2013-03-26T16:49:40.513 回答