如何校验日期java
校验日期的 Java 方法
使用 SimpleDateFormat 和 setLenient 方法
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateValidator {
public static boolean isValidDate(String dateStr, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setLenient(false);
try {
Date date = sdf.parse(dateStr);
return true;
} catch (ParseException e) {
return false;
}
}
}
调用示例:

boolean isValid = DateValidator.isValidDate("2023-02-30", "yyyy-MM-dd");
System.out.println(isValid); // 输出 false,因为 2 月没有 30 日
使用 Java 8 的 LocalDate 和 DateTimeFormatter
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class DateValidator {
public static boolean isValidDate(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
try {
LocalDate.parse(dateStr, formatter);
return true;
} catch (DateTimeParseException e) {
return false;
}
}
}
调用示例:

boolean isValid = DateValidator.isValidDate("2023-02-30", "yyyy-MM-dd");
System.out.println(isValid); // 输出 false
使用 Apache Commons Validator
如果项目中已引入 Apache Commons Validator,可以使用 DateValidator 类:
import org.apache.commons.validator.routines.DateValidator;
public class DateValidationExample {
public static boolean isValidDate(String dateStr, String format) {
DateValidator validator = DateValidator.getInstance();
return validator.isValid(dateStr, format);
}
}
自定义校验逻辑
对于更复杂的校验需求,可以结合正则表达式和逻辑判断:
import java.util.regex.Pattern;
public class DateValidator {
public static boolean isValidDate(String dateStr) {
Pattern pattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");
if (!pattern.matcher(dateStr).matches()) {
return false;
}
String[] parts = dateStr.split("-");
int year = Integer.parseInt(parts[0]);
int month = Integer.parseInt(parts[1]);
int day = Integer.parseInt(parts[2]);
if (month < 1 || month > 12) {
return false;
}
if (day < 1 || day > 31) {
return false;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
return day <= 30;
}
if (month == 2) {
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
return day <= 29;
} else {
return day <= 28;
}
}
return true;
}
}
注意事项
- 使用
SimpleDateFormat时需注意线程安全问题,建议每次使用时创建新实例或使用ThreadLocal。 - Java 8 的日期时间 API(如
LocalDate)是线程安全的,推荐在新项目中使用。 - 自定义逻辑需考虑闰年、月份天数等边界情况。






