SimpleDateFormat.parse没有检测到错误的日期

时间:2018-02-14 12:38:55

标签: java simpledateformat

正在尝试使用SimpleDateFormat。有一点我不明白:为什么以下内容会返回ok

String pattern = "MM/dd/yyyy";
SimpleDateFormat format = new SimpleDateFormat(pattern);

String input = "2023/03/22";
Date d = null;

try {
    d = format.parse(input);
} catch (ParseException e) {
    System.out.println("nok");
}

System.out.println("ok");

返回的日期也很荒谬:Fri Jul 03 00:00:00 CET 190

非常感谢任何解释!

2 个答案:

答案 0 :(得分:1)

让那些想要答案的读者拼出来:

format.setLenient(false)就是您所需要的。

这是你怎么做的。我同意AxelH:你应该使用JDK8,java.time包和LocalTime

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateFormatTest {

    @Test(expected = ParseException.class)
    public void testSetLenient_IncorrectDateInput() throws ParseException {
        // setup
        String input = "2023/03/22";
        String pattern = "MM/dd/yyyy";
        DateFormat format = new SimpleDateFormat(pattern);
        format.setLenient(false);
        // exercise and assert
        format.parse(input);
    }
}

答案 1 :(得分:-1)

  

非常感谢任何解释!

我们走了: 解释很简单:

这种格式" MM / dd / yyyy" 非常简单,对象是什么,该对象期望解析月份日信息。

所以你给这个" 2023/03/22" ,那么这里错的第一个是飞蛾(应该在1到12之间)持有值2023,解析器将其解释为之后的月份12 + 2011。

第03天没问题,第22年就是指克里斯托斯出生后的第22年。

所以您的结果日期是

有效数据加上奇怪的偏移量,即

12/03/0022 + 2011个月。

现在2011个月是相同的:167年零7个月 所以我们做数学:

22年的12 03年加上167年7个月......然后你得到了

Fri Jul 03 00:00:00 CET 190

解决方案:

format.setLenient(boolean);

检查doc以查看在这种情况下会抛出什么异常....