Jodaを使用して、日付/時刻を含むサードパーティのログファイルを解析しています。日付/時刻は、解析しているログファイルの経過時間に応じて、2つの異なる形式のいずれかです。
現在、私はこのようなコードを持っています:
try {
return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}
これは機能しますが、Joshua BlochのEffective Java 2nd Edition(Item 57:例外を例外的な条件にのみ使用)からのアドバイスに違反します。ログファイルの/ time。
例外を誤用しないより良いアプローチを提案できますか?
DateTimeFormatterBuilder.append メソッドを使用して、複数のパーサーを作成してビルダーに追加できます。
DateTimeParser[] parsers = {
DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(),
DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parsers ).toFormatter();
DateTime date1 = formatter.parseDateTime( "2010-01-01" );
DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );
Joda-Timeは、複数のパーサーを指定できるようにすることでこれをサポートします- DateTimeFormatterBuilder#append
ビルダーを使用して2つのフォーマッターを作成し、それぞれでtoParser()
を呼び出すだけです。次に、ビルダーを使用して、append
を使用してそれらを結合します。
残念ながら、Joda Timeにそのような機能があるとは思わない。 「tryParseDateTime」メソッドがあると便利ですが、存在しません。
この動作を独自のクラス(パターンのリストを受け取り、順番に試行するクラス)に分離することをお勧めします。そうすれば、さは1か所だけになります。これがパフォーマンスの問題を引き起こしている場合は、いくつかの経験則を使用して、最初に試行する形式を推測することをお勧めします。たとえば、あなたの場合、文字列が数字で始まる場合、それはおそらく最初のパターンです。
Joda TimeのDateTimeFormatter
sは慣習的に不変であることに注意してください-行を解析するたびに新しいものを作成するべきではありません。一度作成して再利用します。