为什么SimpleDateFormat.parse接受无效的日期字符串?

我有一个java代码,它以特定格式输入日期。

static Date parseDate(String userInput){ DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try { date = format.parse(userInput); System.out.println(date); }catch(ParseException pe){ date=null; System.out.println("Not a valid date"); } return date; } 

现在我进入2015-13-11 89:90:90 ,这是一个无效的日期。 但它将Thu Jan 14 18:31:30 IST 2016作为日期返回。 为什么会这样? 如何让它作为日期返回null?

从javadocs的一瞥,它似乎使用一种lenient的解析模式,它接受格式不佳的输入:

添加此行

 format.setLenient(false); 

初始化DateFormat对象后出现修复它。

我将试图解释为什么会这样。

日期不同,因为超出其字段最大值的值将汇总到下一个更大的字段中。

我不确定它的解决顺序,但这是一般情况:

鉴于2015-13-11 89:90:90

  1. 该年度被解释为2015年,正确设置。 目前2015-01-01 00:00:00
  2. 月份被解释为13,13 / MONTHS_IN_A_YEAR = 1,因此添加了一年,我们将月份设置为1(13个月 – 1年)。 目前2016-01-01 00:00:00
  3. 日期被解释为11.这是正确设置的。 目前2016-01-11 00:00:00
  4. 小时被解释为89,89 / HOURS_IN_A_DAY = 3,因此添加了3天,我们将小时设置为17(89小时 – 3天)。 目前2016-01-14 17:00:00
  5. 分钟被解释为90,90 / MINUTES_IN_A_HOUR = 1,因此添加了1小时,我们将分钟设置为30(90分钟 – 1小时)。 目前2016-01-14 18:30:00
  6. 第二个被解释为90,90 / SECONDS_IN_A_MINUTE = 1,因此添加1分钟,我们将秒数设置为30(90秒-1分钟)。

这让我们留下2016-01-14 18:31:30。