77

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);
}

これは機能しますが、Effective Java 2ndEditionからのJoshuaBlochのアドバイスに違反します(項目57:例外を例外条件にのみ使用します)。また、ログファイルの日付/時刻がめちゃくちゃになっているためにIllegalArgumentExceptionが発生したかどうかを判断するのが難しくなります。

例外を誤用しない、より良いアプローチを提案できますか?

4

3 に答える 3

147

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" );
于 2010-12-02T00:15:10.803 に答える
17

Joda-Timeは、複数のパーサーを指定できるようにすることでこれをサポートしています-DateTimeFormatterBuilder#append

ビルダーを使用して2つのフォーマッターを作成し、toParser()それぞれを呼び出すだけです。次に、ビルダーを使用して、を使用してそれらを結合しますappend

于 2010-07-23T08:52:10.400 に答える
7

残念ながら、JodaTimeにはそのような機能はないと思います。「tryParseDateTime」メソッドがあると便利ですが、存在しません。

この動作を独自のクラス(パターンのリストを取得し、それぞれを順番に試行するクラス)に分離して、醜さが1か所だけになるようにすることをお勧めします。これがパフォーマンスの問題を引き起こしている場合は、ヒューリスティックを使用して、最初に試行する形式を推測することをお勧めします。たとえば、あなたの場合、文字列が数字で始まる場合、それはおそらく最初のパターンです。

Joda Timeのsは従来は不変であることに注意してくださいDateTimeFormatter。行を解析するたびに、新しいものを作成するべきではありません。それらを一度作成して再利用します。

于 2010-07-22T09:22:37.177 に答える