4桁の年のみを解析する方法(Joda Timeを使用)
質問
日付に4桁の年が含まれている場合にのみ、日付を解析するようにJodaに強制する方法はありますか?例:
- 2009-11-11-解析する必要があります
- 09-11-11-解析しないでください
次のコードを試しました:
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");
0009-11-11に解析します。メソッドappendYearのminDigitsは、日付を出力するときの書式設定にのみ使用されているようです。
appendYearOfEra()を使用した場合の結果は同じです。 appendYearOfCentury()を使用すると、年を1909に解析します。
さまざまなタイプの入力を認識する一般的なデータパーサーを実装しています。また、例は実際の取引の短縮形です(簡単にするため)。実際のシナリオでは、平日、月、単語、時間、ゾーン、月、日、年を区切るさまざまな文字を含む日付を解析します。したがって、RegExの記述または文字列の内容/長さの確認は、かなり難しいことがわかります。
実際の例は次のようになります。
- 2009-11-11
- 水曜日2009-11-11T15:00:00
- 2009/11/11 15:00
- その他多数...
解決
DateTimeFormatterBuilder.appendFixedDecimal()は、必要なことを実行できます。
または、DateTimeParserインターフェイスを実装して、必要なパーサーを作成し、それをDateTimeFormatterBuilderに渡すこともできます。
他のヒント
日付文字列の長さを確認できます。
DateTimeFormatterBuilder 。ほとんどの一般的な形式はAPIの他の場所でより簡単に利用できるため、通常、このクラスを直接使用する必要はありませんが、これはすべてカバーの下で使用するビルダークラスです。
日付として「0001-01-01」を入力したユーザーから何を取得しますか(つまり、年に4桁を入力しましたが、最初の3つはゼロでした)? 「0999-12-31」はどうですか?そして、 '999-12-31'? 「10000-01-01」についてはどうですか-悪名高い Y10K 1 の問題?
-
それが正当な値である場合、ユーザーが日付の年の部分として入力した長さ(おそらく他の解析が行われた後)を発見し、それが少なくとも(正確に言うと)4桁。
-
それが正当な値ではない場合、日付が解析された後に年の値をチェックする必要があります。
-
または、有効な年の優先定義が含まれるようにコードを取得して変更することもできます。
1 5000-01-02の前にY10Kの問題を修正する作業を開始する予定はありません。