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

inq*_*ive 12 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.println(date);
        }catch(ParseException pe){
            date=null;
            System.out.println("Not a valid date");
        }
        return date;
    }
Run Code Online (Sandbox Code Playgroud)

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

Kyz*_*erp 16

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

添加此行

format.setLenient(false);
Run Code Online (Sandbox Code Playgroud)

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


Kyl*_*der 6

我将尝试解释为什么会发生这种情况。

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

我不确定它的解决顺序,但通常会发生以下情况:

发表于 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。