「MM/dd/yyyy hh:mm a」を使用して SimpleDateFormat.setLenient オプションを初期化しています false に設定されています。以下にいくつかのユースケースを示します
1) 入力文字列:-01/02/2001 3:09 AM 予想:-合格すべき 実際:-合格
2) 入力文字列:-01/02/20016 3:09 AM 予想:-実際には渡さないでください:-passes 20016 が有効なものとして解析される理由がわかりません!!!!!
「MM/dd/yyyy hh:mm a」を使用して SimpleDateFormat.setLenient オプションを初期化しています false に設定されています。以下にいくつかのユースケースを示します
1) 入力文字列:-01/02/2001 3:09 AM 予想:-合格すべき 実際:-合格
2) 入力文字列:-01/02/20016 3:09 AM 予想:-実際には渡さないでください:-passes 20016 が有効なものとして解析される理由がわかりません!!!!!
次のJavadocにあると思いますSimpleDateFormat
:
Year : 書式設定のために、パターン文字の数が 2 の場合、年は 2 桁に切り捨てられます。それ以外の場合は、数値として解釈されます。
したがって、基本的には 2 に制限できますが、それ以外の場合は int です。したがって、4-y は正確に 4 という意味ではなく、単に「2 ではない」という意味です。
Peterとmprivatに同意しますが、本当にこれを行う必要がある場合の解決策は次のとおりです。
DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a") {
public synchronized Date parse(String source) throws ParseException {
Calendar cal = Calendar.getInstance();
Date d = super.parse(source);
cal.setTime(d);
if (cal.get(Calendar.YEAR) > 9999 ) {
throw new ParseException("Year too long", 11);
}
return d;
};
};
約18000年後の未来です。すべての科学的論理に合格します。では、なぜ 20016 年が遅延であってはならないのでしょうか? :)
(スレッドセーフではないため、SDF は非推奨としてマークする必要があることに注意してください)