2

日付の「単純な」解析を実装するのに問題があります。要件は、年を 2 桁または 4 桁で入力できるようにすることです。2桁入力の場合は、何世紀に属するかを決める分割日を来年1月1日とします。これが私がこれまでに持っているものです:

DateTime now = new DateTime();
int pivotYear = now.getYear() - 49; // 2013 - 49 = 1964 where 49 is the
DateTimeParser[] parsers = {
    DateTimeFormat.forPattern("dd/MM/yy").withPivotYear(pivotYear).withLocale(new Locale("en", "NZ")).getParser(),
    DateTimeFormat.forPattern("dd/MM/yyyy").withLocale(new Locale("en", "NZ")).getParser() 
};
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter();
DateMidnight birthDate = new DateMidnight(formatter.parseDateTime(dateOfBirth));

残念ながら、それは私が期待することをしていません。dateOfBirth = "01/01/14"今日の日付 (2013 年 11 月 4 日) としましょう2014-01-01T00:00:00.000+13:00。期待される結果は1914-01-01T00:00:00.000+13:00

append メソッドの JavaDoc を見ると、この文が表示されます

プリンターとパーサーのインターフェースは、フォーマット API の低レベル部分です。通常、インスタンスは別のフォーマッタから抽出されます。ただし、ロケール、タイムゾーン、年表、オフセット解析、ピボット/デフォルト年などのフォーマッタ固有の情報は、このメソッドでは抽出されないことに注意してください。

そこで、Pivo​​t をDateTimeFormatterBuilderクラスに移動することにしたので、コードは次のようになります。

DateTimeParser[] parsers = { 
    DateTimeFormat.forPattern("dd/MM/yy").getParser(),
    DateTimeFormat.forPattern("dd/MM/yyyy").getParser()
};
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).appendTwoDigitYear(pivotYear).toFormatter().withLocale(new Locale("en", "NZ"));

残念ながら、これは問題を分類していません。それどころか、今回は失敗しています

java.lang.IllegalArgumentException: 無効な形式: "01/01/14" は org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866) で短すぎます

同じjavadocから、この文を取得します

プリンターと一致するパーサーのセットを追加します。解析時には、リスト内の最初のパーサーが解析用に選択されます。失敗した場合は、次が選択されます。これらのパーサーのいずれも成功しなかった場合、最大の進行を遂げたパーサーの失敗した位置が返されます。

これに基づいて、最初のパーサーがジョブを取得する必要がありますが、2 番目のパーサーがトリガーされ、より長い年が予想されるため失敗するようです。

どんな助けでも大歓迎です。乾杯トーマス

4

1 に答える 1