杰瑞科技汇

Java如何用正则表达式判断日期格式?

Java中使用正则表达式判断日期格式

在Java中,可以使用正则表达式来验证日期格式是否符合特定要求,以下是一些常见的日期格式验证示例:

基本日期格式验证 (YYYY-MM-DD)

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class DateValidator {
    private static final String DATE_REGEX = 
        "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$";
    private static final Pattern DATE_PATTERN = Pattern.compile(DATE_REGEX);
    public static boolean isValidDate(String date) {
        if (date == null) {
            return false;
        }
        Matcher matcher = DATE_PATTERN.matcher(date);
        return matcher.matches();
    }
    public static void main(String[] args) {
        String[] testDates = {
            "2025-05-15",  // 有效
            "2025-12-31",  // 有效
            "2025-02-28",  // 有效(非闰年)
            "2025-13-01",  // 无效(月份)
            "2025-05-32",  // 无效(日期)
            "23-05-15",    // 无效(年份)
            "2025/05/15",  // 无效(分隔符)
            null           // 无效
        };
        for (String date : testDates) {
            System.out.println(date + " : " + isValidDate(date));
        }
    }
}

更严格的日期验证(考虑闰年)

上面的正则表达式可以验证格式,但不能验证日期的合理性(如2月30日),下面是一个更完整的实现:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class StrictDateValidator {
    private static final String DATE_REGEX = 
        "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$";
    public static boolean isValidDate(String dateStr) {
        if (dateStr == null || !dateStr.matches(DATE_REGEX)) {
            return false;
        }
        try {
            LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }
    public static void main(String[] args) {
        String[] testDates = {
            "2025-02-29",  // 有效(闰年)
            "2025-02-28",  // 有效(非闰年)
            "2025-02-29",  // 无效(非闰年)
            "2025-04-31",  // 无效(4月只有30天)
            "2025-06-31",  // 无效(6月只有30天)
            "2025-11-31",  // 无效(11月只有30天)
            "2025-05-15"   // 有效
        };
        for (String date : testDates) {
            System.out.println(date + " : " + isValidDate(date));
        }
    }
}

支持多种日期格式

如果需要验证多种日期格式,可以使用以下方法:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.List;
public class MultiFormatDateValidator {
    private static final List<DateTimeFormatter> DATE_FORMATTERS = Arrays.asList(
        DateTimeFormatter.ofPattern("yyyy-MM-dd"),
        DateTimeFormatter.ofPattern("dd/MM/yyyy"),
        DateTimeFormatter.ofPattern("MM/dd/yyyy"),
        DateTimeFormatter.ofPattern("yyyyMMdd")
    );
    public static boolean isValidDate(String dateStr) {
        if (dateStr == null) {
            return false;
        }
        for (DateTimeFormatter formatter : DATE_FORMATTERS) {
            try {
                LocalDate.parse(dateStr, formatter);
                return true;
            } catch (DateTimeParseException e) {
                // 尝试下一种格式
            }
        }
        return false;
    }
    public static void main(String[] args) {
        String[] testDates = {
            "2025-05-15",  // 有效(ISO格式)
            "15/05/2025",  // 有效(欧洲格式)
            "05/15/2025",  // 有效(美国格式)
            "20250515",    // 有效(紧凑格式)
            "2025/05/15",  // 无效
            "15-05-2025",  // 无效
            null           // 无效
        };
        for (String date : testDates) {
            System.out.println(date + " : " + isValidDate(date));
        }
    }
}

注意事项

  1. 正则表达式只能验证格式,不能验证日期的合理性(如2月30日)
  2. 对于严格的日期验证,建议使用Java 8的LocalDate
  3. 考虑时区问题,如果需要处理不同时区的日期
  4. 对于生产环境,建议使用成熟的日期处理库如Joda-Time或Java 8的日期时间API

方法可以根据实际需求进行调整,以支持特定的日期格式验证要求。

分享:
扫描分享到社交APP
上一篇
下一篇