4

我正在使用 NetBeans IDE 7.2。我有两个单独的类newDateTest.java,并且newDateMethod.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 但不确定这在这里是否合适?如果是的话就不知道怎么用了

4

7 回答 7

11

像这样:

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 VV 的评论。所有 Java 和 Kotlin 开发人员都应该更喜欢 java.time 包。

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

于 2013-01-07T10:46:31.110 回答
3

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

于 2013-01-07T10:46:54.283 回答
1

标准的 JDK 类是SimpleDateFormat

DateFormat fmt = new SimpleDateFormat("yourformathere");

// use fmt.parse() to check for validity

或者,我建议使用Joda TimeDateTimeFormat.

于 2013-01-07T10:49:03.647 回答
1

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

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

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

于 2013-01-07T11:14:55.600 回答
1

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和/或 的isAfter方法LocalDate

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

Oracle 教程:日期时间解释如何使用 java.time。

于 2021-07-13T12:15:38.813 回答
0

你应该使用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;
    }
}
于 2013-01-07T10:48:39.403 回答
0

可以使用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则日期无效。

于 2018-12-13T05:08:46.187 回答