SimpleDateFormat未按预期工作

时间:2012-05-21 13:12:24

标签: java date time date-format simpledateformat

我正在使用“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被解析为有效的!!!!!

3 个答案:

答案 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应该被标记为已弃用,因为它不是线程安全的)