1

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

4

3 回答 3

6

我认为它在 Javadoc 中用于SimpleDateFormat

Year:对于格式化,如果模式字母的个数为 2,则将年份截断为 2 位;否则它被解释为一个数字。

所以基本上,你可以将它限制为 2,否则,它是一个 int。所以 4-y 并不完全是 4,它只是“不是 2”。

于 2012-05-21T13:17:32.327 回答
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;
        };
    };
于 2012-05-21T13:34:37.873 回答
2

它大约在未来 18000 年。通过所有科学逻辑。那么为什么 20016 年不应该延迟呢?:)

(记住 SDF 应该被标记为已弃用,因为它不是线程安全的)

于 2012-05-21T13:18:05.087 回答