SimpleDateFormat提供错误的日期而不是错误

时间:2011-05-17 09:26:15

标签: java simpledateformat

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

日期:13-13-2007

模式:dd-MM-yyyy

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

我在这里期待例外。如果给定日期不合适,我该怎么做才能生成异常。

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:3)

设置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”,那么您将获得有效的结果。

答案 2 :(得分:3)

java.time

我想贡献现代的答案。在2011年提出此问题时,使用SimpleDateFormatDate是合理的。不再了。这些类的设计总是很差,并在2014年被现代Java日期和时间API java.time取代,所以现在已经过时了。

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

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

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

  

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

也请注意并享受准确而翔实的异常消息。

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

链接

相关问题