web-dev-qa-db-ja.com

Joda Date&Time APIを使用して複数の形式を解析する

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。

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

73
Steve McLeod

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" );
140
btiernay

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

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

17
JodaStephen

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

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

Joda TimeのDateTimeFormattersは慣習的に不変であることに注意してください-行を解析するたびに新しいものを作成するべきではありません。一度作成して再利用します。

7
Jon Skeet