web-dev-qa-db-ja.com

SimpleDateFormat( "MM / dd / yyyy")が日付を2012年10月20日まで解析する理由

私はこのコードを持っています:

  DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
  dateFormat.setLenient(false);
  Date date = dateFormat.parse("10/20/20128");

そして、私が提供している年は、定義した形式のように4文字ではなく5文字であるため、dateFormat.parse呼び出しがParseExceptionをスローすることを期待しています。しかし、何らかの理由でlenientをfalseに設定しても、この呼び出しは10/20/20128のDateオブジェクトを返します。

何故ですか?私にはあまり意味がありません。さらに厳密にする別の設定はありますか?

22
goe

20128は有効な年であり、Javaは世界がその長生きすることを願っています。

パターン文字の数が2を超える場合、年は数字の桁数に関係なく文字どおりに解釈されます。

Reference。

日付が制限内にあるかどうかを検証する場合は、日付を定義してチェック-

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date maxDate = sdf.parse("01/01/2099");  // This is the limit

if(someDate.after(maxDate)){            
    System.out.println("Invalid date");            
}
39
Sajal Dutta

javadoc を参照してください

年:フォーマッタのカレンダーがグレゴリオ暦の場合、次の規則が適用されます。

  • フォーマットでは、パターン文字の数が2の場合、年は2桁に切り捨てられます。それ以外の場合は、数値として解釈されます。
  • 解析の場合、パターン文字の数が2より大きい場合、桁数に関係なく、年はそのまま解釈されます。したがって、パターン「MM/dd/yyyy」を使用すると、「01/11/12」は西暦12年1月11日まで解析されます。
  • 省略された年パターン(「y」または「yy」)を使用した解析の場合、SimpleDateFormatは、ある世紀に関連する省略された年を解釈する必要があります。これは、SimpleDateFormatインスタンスが作成された時刻の前後80年以内に日付を調整することでこれを行います。たとえば、「MM/dd/yy」のパターンとSimpleDateFormatを使用する
    1997年1月1日に作成されたインスタンス、文字列「01/11/12」は
    2012年1月11日と解釈されますが、文字列「05/04/64」は
    1964年5月4日と解釈されます。解析中は、
    Character.isDigit(char)で定義されている正確に2桁の数字は、デフォルトの世紀に解析されます。その他の数値文字列(aなど)
    1桁の文字列、3桁以上の文字列、またはすべてが数字ではない2桁の文字列(たとえば、「-1」)は、文字どおりに解釈されます。
    したがって、「01/02/3」または「01/02/003」は、同じパターンを使用して解析されます。
    Jan 2、3 AD。同様に、「01/02/-3」はBC 1月2日4として解析されます。
  • それ以外の場合は、カレンダーシステム固有のフォームが適用されます。書式設定と解析の両方で、パターン文字の数が4または
    さらに、カレンダー固有の長い形式が使用されます。そうでなければ、カレンダー
    特定の短い形式または省略形が使用されます。

したがって、年として最後の/の後に来るすべての文字を読み取ります。

11

見る Java.text.SimpleDateFormat AP​​I、パターン文字y:解析の場合、パターン文字の数が2を超える場合、桁数に関係なく、年は文字どおりに解釈されます。

7

JavaでSimpleDateFormatを使用すると、人間が読み取れる多くの形式を実現できます。次のコードスニペットを検討してください。

        Date curDate = new Date();

        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

        String DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd MMMM yyyy zzzz", Locale.ENGLISH);
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

さまざまな形式で生成されたさまざまな出力を見てください。

2014/05/11

11-5-2014 11:11:51

2014年5月11日東ヨーロッパ夏時間

日、2014年5月11日23:11:51 EEST

書式文字列を自由に変更すると、目的の結果が得られる場合があります。

1
Vishal Kumar