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

Java 为什么SimpleDataFormat.parse接受无效的日期字符串?,java,date,Java,Date,我有一个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.printl

我有一个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;
    }
现在我输入的是无效日期。但它返回日期为2016年1月14日星期四18:31:30。为什么会这样?如何使其返回null作为日期?

从中可以看出,它似乎使用了一种
宽松的
解析模式,在这种模式下,它接受格式不良的输入:

添加此行

format.setLenient(false);

初始化DateFormat对象后,它似乎会修复。

我将尝试解释发生这种情况的原因

日期是不同的,因为超过其字段最大值的值将被汇总到下一个较大的字段中

我不确定解决问题的顺序,但以下是一般情况:

给定2015-13-11 89:90:90

  • 该年被解释为2015年,即设置正确。当前2015-01-01 00:00:00
  • 月份被解释为13,13/MONTHS\u IN\u A\u YEAR=1,因此添加了一年,我们将月份设置为1(13个月-1年)。当前2016-01-01 00:00:00
  • 日期被解释为11。这是正确设置的。当前2016-01-11 00:00:00
  • 小时被解释为89,89/HOURS_IN_A_DAY=3,因此添加了3天,我们将小时设置为17(89小时-3天)。当前2016-01-14 17:00:00
  • 分钟被解释为90,90/MINUTES_IN_A_HOUR=1,因此加上1小时,我们将分钟设置为30(90分钟-1小时)。当前2016-01-14 18:30:00
  • 第二个被解释为90,90/SECONDS,IN_A_MINUTE=1,因此加上1分钟,我们将秒设置为30(90秒-1分钟)

  • 这就给我们留下了2016-01-14 18:31:30。

    好吧,我错过了你故意输入错误;)当然希望违约是严格的而不是宽松的。