如何在Java中检查MM/dd/yyyy中的日期有效性


LocalDateTime dateAndTime = LocalDateTime.now(); //gets current date and time

String birthdateIn = cBirthdate.getText(); //gets birthdate input

SimpleDateFormat mmddyyyy = new SimpleDateFormat("mm/dd/yyyy"); //mm/dd/yyyy formatter
mmddyyyy.setLenient(false);

try {
Date stringToDate = mmddyyyy.parse(birthdateIn);
bLabel.setForeground(Color.green);
bLabel.setText("Valid Birthdate");
}
catch (ParseException e) {
bLabel.setForeground(Color.red);
bLabel.setText("Invalid Birthdate");
}

这是我在JFrame中用于检查出生日期有效性的代码,虽然检查器工作正常,但当我输入一个整数时,它会验证年份,而不是检查它是否包含4个整数。如何更正?

此外,我如何提取输入的出生日期来检查用户是否低于18岁?

我建议使用新的日期/时间API(java.time(,而不是旧类。因此,可以使用具有必要模式的DateTimeFormatterbirthdateIn解析为LocalDate对象。之后,您可以通过使用LocalDate#isAfterLocalDate.now().minusYears(18)来检查用户是否在18岁以下。

下面是一个工作示例:

String birthdateIn = "01/09/2003"; // change to check boundaries
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
try {
LocalDate birthdate = LocalDate.parse(birthdateIn, formatter);
System.out.println("Valid Birthdate");

if (birthdate.isAfter(LocalDate.now().minusYears(18))) {
System.out.println("not 18 years yet");
} else {
System.out.println("18 years or older");
}
} catch (DateTimeParseException e) {
System.out.println("Invalid Birthdate");
}

java.time您已经在使用java.time中的LocalDateTime,这是现代java日期和时间API。我当然建议您坚持java.time,避免使用旧的SimpleDateFormat类。这是一个出了名的麻烦类,尤其是对验证毫无希望(将宽大处理设置为false有一点帮助,但只解决了众多问题中的一个(。

您可能希望通过两种方式验证出生日期:

  1. 字符串应该是有效的日期
  2. 日期应在合理范围内。例如,对于一个活着的人的出生日期,说它不能超过140年前,也不能在未来

你需要的大部分代码已经在Matt的好答案中了,所以我不重复了。

您可以使用我为您修改的这个形状非常好的正则表达式来验证您获得的日期是正确形状的

birthdateIn.matches("^(((0[13578]|(10|12))/(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))/[0-9]{4}$")

相关内容

最新更新