在Java中验证日期

iugsix8n  于 2023-01-24  发布在  Java
关注(0)|答案(7)|浏览(154)

我使用的是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还是个新手。
有人能想出一个解决方案吗?我被教导使用的是日期格式设置器,但我不确定这是否适合这里?如果是这样,我不知道如何使用它

esyap4oy

esyap4oy1#

就像这样:

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包。
如果时间允许,我将添加一个更现代的例子。

7vux5j2d

7vux5j2d2#

看一下SimpleDateFormat.parse(...),记住用try-catch包围。

zc0qhyus

zc0qhyus3#

其标准JDK类为SimpleDateFormat

DateFormat fmt = new SimpleDateFormat("yourformathere");

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

或者,我建议使用Joda TimeDateTimeFormat

rbpvctlc

rbpvctlc4#

与其依赖于性能开销较小的异常,还可以使用Apache公共例程包中的DateValidator,如下所示:

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

虽然有一个小小的免责声明,但我还没有看过validate方法的实现,我不确定它是否使用了SimpleDateFormat...

0qx6xfy6

0qx6xfy65#

Java.时间

我建议您使用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

为了进行良好的验证,您可能应该添加一个范围检查。使用isBefore和/或LocalDateisAfter方法。
此外,如果您要对日期执行除验证之外的任何操作,则应该在程序中避免解析LocalDate(而不是字符串)。

链接

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

vhmi4jdf

vhmi4jdf6#

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

oug3syen7#

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

相关问题