为什么 SimpleDateFormat("MM/dd/yyyy") 将日期解析为 10/20/20128?

新手上路,请多包涵

我有这段代码:

   DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
  dateFormat.setLenient(false);
  Date date = dateFormat.parse("10/20/20128");

我希望 dateFormat.parse 调用抛出 ParseException,因为我提供的年份是 5 个字符长,而不是我定义的格式中的 4 个字符。但出于某种原因,即使将 lenient 设置为 false,此调用也会返回 10/20/20128 的 Date 对象。

这是为什么?这对我来说没有多大意义。是否有其他设置使其更加严格?

原文由 goe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 481
2 个回答

20128 年是有效的一年,我猜 Java 希望世界能活那么久。

如果模式字母的数量超过 2,则按字面解释年份,而不管数字的数量。

参考。

如果您想验证日期是否在限制范围内,您可以定义一个并检查 -

 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date maxDate = sdf.parse("01/01/2099");  // This is the limit

if(someDate.after(maxDate)){
    System.out.println("Invalid date");
}

原文由 Sajal Dutta 发布,翻译遵循 CC BY-SA 3.0 许可协议

查看 javadoc

年份:如果格式化程序的日历是公历,则应用以下规则。

  • 格式化时,如果模式字母个数为2,则年份截断为2位;否则它被解释为一个数字。
  • 对于解析,如果模式字母的数量超过 2, 则按字面解释年份,而不管数字的数量。所以使用模式“MM/dd/yyyy”,“01/11/12”解析为 Jan 11, 12 AD
  • 为了使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat 必须解释相对于某个世纪的缩写年份。它通过将日期调整为在创建 SimpleDateFormat 实例之前 80 年和之后 20 年内来实现。例如,使用“MM/dd/yy”模式和 SimpleDateFormat

在 1997 年 1 月 1 日创建的实例,字符串“01/11/12”将是

解释为 2012 年 1 月 11 日,而字符串“05/04/64”将是

解释为 1964 年 5 月 4 日。在解析期间,只有字符串包含

由 Character.isDigit(char) 定义的恰好两位数字将被解析为默认世纪。任何其他数字字符串,例如

一个数字字符串、一个三位或更多数字字符串,或者不是所有数字的两位数字字符串(例如,“-1”)按字面解释。

所以“01/02/3”或“01/02/003”被解析,使用相同的模式,作为

公元 3 年 1 月 2 日。同样,“01/02/-3”被解析为 Jan 2, 4 BC。 - 否则,应用日历系统特定的形式。对于格式化和解析,如果模式字母的数量为 4 或

此外,使用日历特定的长格式。否则,日历

使用特定的简短或缩写形式。

因此,它将读取最后一个 / 之后的所有字符作为年份。

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题