简单的日期格式解析 2k11 之类的值,应该抛出异常

Simple date format parses 2k11 like values which should throw an exception

我正在尝试使用简单的数据格式验证日期,它会解析奇怪的日期。

 val dateFormat = new SimpleDateFormat("dd MMM, yyyy")
      dateFormat.setLenient(false)
      dateFormat.parse("01 Jan, 2k11")

1 月 1 日星期日 00:00:00 IST 2

快速时间:-62104253400000

c日期:C.E。 2-01-01T00:00:00.000+0530

我开始挖掘 SimpleDateFormat 的源代码,并阅读了足够多的内容以了解此处似乎发生了什么。发生的情况是您的年份组件 2k11 被解释为两位数的年份(实际上是一位数,2),并且随后的所有内容都被忽略,因为它们不是日期模式的一部分。考虑以下产生相同结果的代码:

  DateFormat dateFormat = new SimpleDateFormat("dd MMM, yyyy");
  dateFormat.setLenient(false);
  Date blah = dateFormat.parse("01 Jan, 2 Jon Skeet");
  System.out.println(blah);

这会打印:

Sun Jan 01 00:00:00 CET 2

如您所见,解释年份为 2,Jon Skeet 简介被忽略。要准确理解 为什么 SimpleDateFormat 这样做,请阅读源代码。