質問

日付に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の問題を修正する作業を開始する予定はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top