7

我正在使用以下模式和日期

日期 : 13-13-2007

模式:dd-MM-yyyy

输出:Sun Jan 13 00:00:00 IST 2008 或 2008-01-13 00:00:00.0

我在这里期待异常。当给定日期不正确时,我该怎么做才能生成异常。

4

3 回答 3

14

用于DateFormat.setLenient(false)告诉DateFormat/SimpleDateFormat你希望它是严格的。

于 2011-05-17T09:27:25.380 回答
3

Set Lenient 适用于大多数情况,但如果您想检查确切的字符串模式,那么这可能会有所帮助,

    String s = "03/6/1988";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        sdf.setLenient(false);
        Date d = sdf.parse(s);
        String s1 = sdf.format(d);
        if (s1.equals(s))
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    } catch (ParseException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }

如果您将输入输入为“03/06/1988”,那么您将获得有效的结果。

于 2014-08-04T07:32:23.877 回答
3

java.time

我想贡献现代答案。2011年问这个问题的时候,合理的用SimpleDateFormatand Date. 现在不是了。这些类的设计总是很糟糕,并在 2014 年被现代 Java 日期和时间 API java.time 取代,因此现在早已过时。

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu")
            .withResolverStyle(ResolverStyle.STRICT);

    String dateString = "13-13-2007";
    LocalDate date = LocalDate.parse(dateString, dateFormatter);

此代码给出了您预期的异常(并且有充分的理由预期):

线程“主”java.time.format.DateTimeParseException 中的异常:无法解析文本“13-13-2007”:MonthOfYear 的值无效(有效值 1 - 12):13

还请注意并享受准确且信息丰富的异常消息。

DateTimeFormatter具有三种所谓的解析器样式,严格、智能和宽松。智能是默认设置,您几乎不需要其他任何东西。如果您想确保在所有情况下捕获所有无效日期,请使用 strict。

Links

于 2019-03-06T10:57:37.597 回答