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

时间:2015-07-30 22:24:34

标签: 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;
    }

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

2 个答案:

答案 0 :(得分:16)

javadocs一眼就可以看出,它似乎使用了lenient解析模式,它接受格式错误的输入:

添加此行

format.setLenient(false);
初始化DateFormat对象后,

似乎可以修复它。

答案 1 :(得分:4)

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

日期不同,因为超出其字段最大值的值会累积到下一个更大的字段中。

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

鉴于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分钟)。
  7. 这让我们留下2016-01-14 18:31:30。