Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Validate định dạng ngày MM/DD/YYYY bằng Regex trong Java

Dùng java.util.regex.Pattern và Matcher để validate chuỗi ngày tháng theo format MM/DD/YYYY.

Regex pattern


^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$

Giải thích:

  • 1[0-2]|0[1-9] – Tháng 01-12
  • 3[01]|[12][0-9]|0[1-9] – Ngày 01-31
  • [0-9]{4} – Năm 4 chữ số
  • ^...$ – Khớp toàn bộ chuỗi

Ví dụ


import java.util.regex.*;

public class DateFormatValidator {
    private static final Pattern DATE_PATTERN = Pattern.compile(
        "^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/\\d{4}$"
    );
    
    public static boolean isValidDateFormat(String dateStr) {
        if (dateStr == null) return false;
        Matcher m = DATE_PATTERN.matcher(dateStr);
        return m.matches();
    }
    
    public static void main(String[] args) {
        String[] tests = {
            "01/12/2019", "12/31/2020", "13/01/2020", // invalid month
            "02/30/2020", "00/15/2020", "1/1/2020"    // invalid format
        };
        
        for (String d : tests) {
            System.out.printf("%-12s -> %s%n", d, isValidDateFormat(d) ? "✅ Valid" : "❌ Invalid");
        }
    }
}

Kết quả


01/12/2019   -> ✅ Valid
12/31/2020   -> ✅ Valid
13/01/2020   -> ❌ Invalid
02/30/2020   -> ✅ Valid (format đúng, nhưng ngày không tồn tại)
00/15/2020   -> ❌ Invalid
1/1/2020     -> ❌ Invalid (thiếu leading zero)

⚠️ Regex chỉ validate FORMAT, không validate LOGIC ngày

02/30/2020 pass regex nhưng ngày 30/2 không tồn tại. Cần parse thật để validate logic:


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public static boolean isValidDateLogic(String dateStr) {
    try {
        LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("MM/dd/yyyy"));
        return true;
    } catch (DateTimeParseException e) {
        return false;
    }
}

Kết hợp: Regex nhanh + LocalDate chính xác


public static boolean isValidDate(String s) {
    if (s == null || !DATE_PATTERN.matcher(s).matches()) return false;
    try {
        LocalDate.parse(s, DateTimeFormatter.ofPattern("MM/dd/yyyy"));
        return true;
    } catch (DateTimeParseException e) {
        return false;
    }
}