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

Joda时间解析字符串抛出java.lang.IllegalArgumentException,java,jodatime,date-formatting,date-parsing,Java,Jodatime,Date Formatting,Date Parsing,难道不能使用LocalDateTime.parse()解析使用特定DateTimeFormatter格式化的字符串吗 测试 DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis() LocalDateTime ldt = new LocalDateTime() String val = ldt.toString(formatter) System.out.println(val) //2013-03-26T13:10:4

难道不能使用
LocalDateTime.parse()
解析使用特定
DateTimeFormatter
格式化的
字符串吗

测试

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) 

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

因此,它是预期格式的一个因素——在本例中是
yyyy-MM-dd'HH:MM:ssZZ
;基本上,它是在抱怨你没有超过时区

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

请查看以下内容:

返回一个基本格式化程序,该格式化程序将不带毫秒的基本日期和时间组合在一起,以“T”(yyyyMMdd'T'hhmmsz)分隔。时区偏移为“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

我会说这是JodaTime的一个bug。它应该解析任何具有格式的字符串,因为formatter是DateTimeFormatter的对象,而DateTimeFormatter并没有发生。