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 に答える