4

日付に 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
  • などなど...
4

4 に答える 4

7

DateTimeFormatterBuilder.appendFixedDecimal() は、必要なことを十分に行うことができます。

または、DateTimeParser インターフェイスを実装して、必要なパーサーを作成し、それを DateTimeFormatterBuilder に渡すこともできます。

于 2009-11-11T11:38:29.247 に答える
1

日付文字列の長さを確認できます。

于 2009-10-23T09:13:19.763 に答える
1

DateTimeFormatterBuilderを使用して、非常に特殊なパーサーとフォーマッターを構築できます。通常、このクラスを直接使用する必要はありません。ほとんどの一般的な形式は、API の他の場所で簡単に使用できるためです。ただし、これは、すべてが内部で使用するビルダー クラスです。

于 2009-10-23T08:58:34.740 に答える
0

日付として '0001-01-01' を入力したユーザー (つまり、年として 4 桁を入力したが、最初の 3 桁がゼロだった) から何を取得したいですか? 「0999-12-31」はどうですか?そして「999-12-31」?悪名高いY10K 1問題である「10000-01-01」についてはどうでしょうか。

  • それが正当な値である場合、ユーザーが日付の年の部分として入力した長さを発見することで立ち往生し (おそらく他の解析が行われた後)、それが少なくとも (または正確に?) 4 桁。

  • それが正当な値でない場合は、日付が解析された後に年の値をチェックすることになります。

  • または、コードを取得して変更して、有効な年の優先定義が含まれるようにすることもできます。


1 5000-01-02 より前に Y10K 問題の修正に取り掛かる予定はありません。

于 2009-10-29T03:08:35.130 に答える