0

現在取り組んでいるプロジェクトでは、StringDateに変換する必要があります。残念ながら、日付と時刻は、変換する必要があるすべての文字列で同じ形式ではありません。現在の値では、2011-06-25T22:44:12または2011-06-25 22:49:01のようなものがよく見られます(T? に注意してください)。

SimpleDateFormatを使用して文字列日付に変換する方法は知っていますが、入力の形式がわからないため、これは正しいアプローチではないようです。複数の「フォーマット」をDateFormatオブジェクトに追加する方法があるかどうか、またはフォーマットを自動検出できるDateFormatクラスがあるかどうか疑問に思っていましたか?

私が考えていたもう1つのアプローチは、文字列でif/elseステートメントと正規表現を使用して、使用されている形式を特定し、それに一致するSimpleDateFormatクラスを使用することですが、もっと簡単な方法があるはずです. 助言がありますか?

4

3 に答える 3

1

内部の T は、日付http://en.wikipedia.org/wiki/ISO_8601の標準 ISO 形式であるためです。ただし、'T' を使用したこの形式は、日付が ISO 8601 として表示される場合に見られるいくつかのバリエーションの 1 つにすぎないことに注意してください (バリエーションの 1 つは時刻が取り除かれ、別のバリエーションは次のタイムゾーン仕様を使用しています)。

日付が ISO 8601 標準に準拠していることがわかっている場合 (これは、明確に指定された XML の場合に非常によくあります。XSD 日付フィールドを使用する場合、ISO 8601 に準拠しています)、Java の SimpleDateFormat では不十分です。単純すぎます...代わりに JodaTime ライブラリに戻すこともできます - Joda Time にはすでに ISO 8601 フォーマッタがあり、すぐに使用できます: http://joda-time.sourceforge.net/api-release/org/joda/time/format/ISODateTimeFormat.html

編集済み: 複雑な正規表現マッチングを実装しません。長期的にはコードの保守と理解が困難になります (特に、多くの形式で多くのソースを使用できる場合)。

提案は次のとおりです - どのプロバイダがどのフォーマットを使用しているかを調べ、戦略パターンを採用します: formatter = DateFormatterStrategyChooser.getFormatter(String source)。Divide et impera.

また、どのソースがどの種類の日付をもたらすのか 100% 確信がない場合でも、UmbrellaFormatter(Collection) を使用して、成功するまで各フォーマッタを順番に処理できます。これは、あいまいで複雑なルールに依存するよりも保守性を高めるのに最適です。 .

于 2011-06-25T21:35:59.353 に答える
0

「T」を使用したものとスペースを使用したものだけでなく、いくつかのバリエーションがある場合は、いくつかの正規表現と一致する SimpleDateFormats を使用した if/then/else が最適だと思います。

于 2011-06-25T21:25:43.177 に答える
0

「T」の存在をテストし、存在する場合は、文字列を解析してスペースに置き換えます。これで、Date Formatter を使用して Date オブジェクトを作成できるようになりました。

于 2011-06-25T21:24:22.873 に答える