【问题标题】:SimpleDateFormat giving wrong date instead of errorSimpleDateFormat 给出错误的日期而不是错误
【发布时间】:2011-08-27 02:16:45
【问题描述】:

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

日期:2007 年 13 月 13 日

模式:dd-MM-yyyy

输出:2008 年 1 月 13 日星期日 00:00:00 IST 要么 2008-01-13 00:00:00.0

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

【问题讨论】:

    标签: java simpledateformat


    【解决方案1】:

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

    【讨论】:

    • 进行更改后,您提到,它在 date:"13-10-2007 16:52:12.014789", pattern:"dd-MM-yyyy HH:mm:ss. SSSSSS”。
    • 我找到了答案。 Java 在 ms 字段中支持 3 位表示 dd-MM-yyyy HH:mm:ss.SSS 是可支持的
    • 更新: 随着 JSR 310 的采用,此答案现已过时。有关使用 java.time 类的现代解决方案,请参阅 @987654322 @ by Ole VV
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      java.time

      我想提供现代答案。 2011年问这个问题的时候,使用SimpleDateFormatDate是合理的。现在不是了。这些类总是设计得很糟糕,并在 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。

      链接

      【讨论】:

        猜你喜欢
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多