我正在使用“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被解析为有效的!!!!!
答案 0 :(得分:6)
我认为这是SimpleDateFormat
的Javadoc:
年份:对于格式设置,如果模式字母数为2,则年份将截断为2位数;否则它被解释为数字。
所以基本上,你可以将它约束为2,但除此之外,它是一个int。所以4-y并不意味着4,它只是“不是2”。
答案 1 :(得分:4)
我同意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;
};
};
答案 2 :(得分:2)
未来大约18000年。传递所有科学逻辑。 那么为什么20016年不适合? :)
(请记住,SDF应该被标记为已弃用,因为它不是线程安全的)