【问题标题】:Validating a date in java在java中验证日期
【发布时间】:2013-01-07 10:44:27
【问题描述】:

我正在使用 NetBeans IDE 7.2。 我有两个单独的类newDateTest.javanewDateMethod.java,我目前正在使用我的方法类来验证我在测试类中使用的用户输入的日期。

到目前为止,在我的测试课程中,我有以下内容:

try
{
    Prompt ="please enter a date in the format dd-mm-yyyy";
    System.out.println(Prompt);
    String inputDate = in.next();
    isValid = newDateMethod.validDate(input, input, input);
    if (isValid){
        System.out.println("VALID DATE");

    } else {
        System.out.println("INVALID DATE");

    }

}catch (ArrayIndexOutOfBoundsException oob) {
    System.out.println(oob);
}
}

但是我不知道如何在我的方法类中验证日期,因为我对 Java 还很陌生。

任何人都可以找到解决方案吗?我被教导使用的那种 iof 东西是 Date Formmater 但不确定这在这里是否合适?如果是的话就不知道怎么用了

【问题讨论】:

  • 您的问题吸引了很多推荐 SimpleDateFormat 类的答案。小心这个。举两个例子, parse() 方法无法检测到错误的月份(即第 13 个月),并且年份的格式可以随着更长的年份而爆发。你不能只验证这个类的日期。这取决于您要验证的什么

标签: java validation datetime


【解决方案1】:

像这样:

Date date = null;
String inputDate = "07-01-2013";
try {
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
    formatter.setLenient(false);
    date = formatter.parse(inputDate);
} catch (ParseException e) { 
    e.printStackTrace();
}

2021 年 7 月 13 日更新:

我非常同意下面 Ole V.V. 的评论。所有 Java 和 Kotlin 开发人员都应该更喜欢 java.time 包。

如果时间允许,我会添加一个更现代的示例。

【讨论】:

  • 错了!!如果您输入的不是“07-01-2013”​​,而是“07-01-017”或“07-01-2ooo”,则不会出现异常,但格式错误
  • 对于这个问题和/或这个答案的新读者,我建议我们不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter
【解决方案2】:

看看SimpleDateFormat.parse(...),记得用try-catch包围。

【讨论】:

    【解决方案3】:

    标准的 JDK 类是 SimpleDateFormat:

    DateFormat fmt = new SimpleDateFormat("yourformathere");
    
    // use fmt.parse() to check for validity
    

    或者,我建议使用Joda TimeDateTimeFormat

    【讨论】:

    • 如果您使用“dd/MM/yyyy”作为 SimpleDateFormat 的模式并将日期输入为“13/13/2013”​​,例如,parse 方法将返回一个 java.util.Date日期 2014 年 13 月 1 日。请注意,不要使用低于 Java 8 的标准 JDK 类进行日期计算。
    【解决方案4】:

    您也可以使用 Apache commons 例程包中的 DateValidator,而不是依赖往往具有较小性能开销的异常,如下所示:

    if (DateValidator.getInstance().validate(inputDate, "dd-MM-yyyy") != null) {
      // Date is valid
    }
    else {
      // Date is invalid
    }
    

    虽然小免责声明,我还没有查看 validate 方法的实现,我不确定它是否使用例如 SimpleDateFormat...

    【讨论】:

    • 警告:Date testDate = DateValidator.getInstance().validate("25/13/2013", "dd/MM/yyyy") 正确识别出 13 不是有效月份,但 Date testDate = DateValidator.getInstance().validate("25/13/2013456", "dd/MM/yyyy");尽管掩码只允许 4 个字符,但仍作为有效日期返回。
    【解决方案5】:

    java.time

    我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。它还为您提供比其他一些答案中使用的旧 SimpleDateFormat 类更精确的验证。

        String[] exampleInputStrings = { "07-01-2013", "07-01-017",
                "07-01-2ooo", "32-01-2017", "7-1-2013", "07-01-2013 blabla" };
        
        for (String inputDate : exampleInputStrings) {
            try {
                LocalDate date = LocalDate.parse(inputDate, DATE_FORMATTER);
                System.out.println(inputDate + ": valid date: " + date );
            } catch (DateTimeParseException dtpe) {
                System.out.println(inputDate + ": invalid date: " + dtpe.getMessage());
            }
        }
    

    我的示例代码的输出是:

    07-01-2013: valid date: 2013-01-07
    07-01-017: invalid date: Text '07-01-017' could not be parsed at index 6
    07-01-2ooo: invalid date: Text '07-01-2ooo' could not be parsed at index 6
    32-01-2017: invalid date: Text '32-01-2017' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
    7-1-2013: invalid date: Text '7-1-2013' could not be parsed at index 0
    07-01-2013 blabla: invalid date: Text '07-01-2013 blabla' could not be parsed, unparsed text found at index 10
    

    为了获得良好的验证,您可能应该添加范围检查。使用isBefore 和/或LocalDateisAfter 方法。

    此外,如果您打算对日期做任何事情而不是验证它,您应该在程序中保留LocalDate 不被解析(而不是字符串)。

    Oracle tutorial: Date Time 解释如何使用 java.time。

    【讨论】:

      【解决方案6】:

      您应该使用SimpleDateFormat.parse(String) 方法。如果传递的日期格式错误,则会引发异常,在这种情况下您返回 false。

      public boolean validateDate(String date) {
          SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
          try {
              sdf.parse(date);
              return true;
          }
          catch(ParseException ex) {
              return false;
          }
      }
      

      【讨论】:

      • 参见。 Prompt ="please enter a date in the format dd-mm-yyyy" :-)
      • 错了!!如果您输入的不是“07-01-2013”​​,而是“07-01-017”或“07-01-2ooo”,则不会出现异常,但格式错误
      【解决方案7】:

      可以使用joda-time

      DateTimeFormat.forPattern(INPUTED_DATE_FORMAT);
      //one can also use it with locale
      DateTimeFormat.forPattern(USER_DATE_FORMAT).withLocale(locale);
      fmt.parseDateTime(INPUTED_DATE);
      

      如果 parseDateTime 抛出 IllegalArgumentException 则日期无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        相关资源
        最近更新 更多