我正在使用“MM/dd/yyyy hh:mm a”来初始化 SimpleDateFormat.setLenient 选项设置为 false。以下是一些用例
1)输入字符串:-01/02/2001 3:09 AM 预期:-应该通过实际:-passes
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 预期:-应该通过实际:-passes
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 应该被标记为已弃用,因为它不是线程安全的)