在Java中验证日期



我使用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。

有人能想出解决办法吗?我学过的是日期格式化程序但我不确定这是否合适?如果是这样,我就不知道怎么用了

像这样:

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。时间包。

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

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

标准的JDK类是SimpleDateFormat:

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

或者,我建议使用Joda Time的DateTimeFormat

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

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

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

java.time

我建议你使用java。time,现代Java日期和时间API,用于您的日期工作。它还为您提供了比其他一些答案中使用的旧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

对于一个好的验证,您可能应该添加一个范围检查。使用LocalDateisBefore和/或isAfter方法

此外,如果您打算对日期进行除验证之外的任何操作,则应该在程序中避免解析LocalDate(而不是字符串)。

链接
Oracle tutorial: Date Time说明如何使用java.time

您应该使用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;
    }
}

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

相关内容

  • 没有找到相关文章