私はこのコードを持っています:
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オブジェクトを返します。
何故ですか?私にはあまり意味がありません。さらに厳密にする別の設定はありますか?
20128は有効な年であり、Javaは世界がその長生きすることを願っています。
パターン文字の数が2を超える場合、年は数字の桁数に関係なく文字どおりに解釈されます。
日付が制限内にあるかどうかを検証する場合は、日付を定義してチェック-
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");
}
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または
さらに、カレンダー固有の長い形式が使用されます。そうでなければ、カレンダー
特定の短い形式または省略形が使用されます。
したがって、年として最後の/
の後に来るすべての文字を読み取ります。
見る Java.text.SimpleDateFormat
API、パターン文字y
:解析の場合、パターン文字の数が2を超える場合、桁数に関係なく、年は文字どおりに解釈されます。
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
書式文字列を自由に変更すると、目的の結果が得られる場合があります。