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

2022-09-04 08:14:32

我有一个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;
    }

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


答案 1

javadocs来看,它似乎正在使用一种解析模式,在这种模式下,它接受格式不佳的输入:lenient

添加此行

format.setLenient(false);

在初始化 DateFormat 对象后,将显示以修复它。


答案 2

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

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

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

给定 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。