驗證字符串是否為合法的 yyyyMMddHHmmss 格式日期時間(如 20240115143025),包含年月日時分秒範圍合法性(閏年、大小月、24小時制等)。
Java Calendar 默認寬鬆模式(lenient),會自動修正非法值(如月份 13 變成次年 1 月)。設置 setLenient(false) 後,set() 或 getTime() 遇到非法字段會拋出 IllegalArgumentException,從而實現嚴格校驗。
import java.util.Calendar;
public class DateValidator {
public static boolean checkValidDate(String dateStr) {
if (dateStr == null || dateStr.length() != 14) return false;
try {
int year = Integer.parseInt(dateStr.substring(0, 4));
int month = Integer.parseInt(dateStr.substring(4, 6));
int day = Integer.parseInt(dateStr.substring(6, 8));
int hour = Integer.parseInt(dateStr.substring(8, 10));
int minute = Integer.parseInt(dateStr.substring(10, 12));
int second = Integer.parseInt(dateStr.substring(12, 14));
Calendar cal = Calendar.getInstance();
cal.setLenient(false); // 關鍵:嚴格模式
cal.set(year, month - 1, day); // 月份 0-based
cal.set(year, month - 1, day, hour, minute, second);
cal.getTime(); // 觸發校驗,非法拋異常
return true;
} catch (Exception e) {
return false;
}
}
// 測試
public static void main(String[] args) {
System.out.println(checkValidDate("20240229120000")); // true(閏年)
System.out.println(checkValidDate("20230229120000")); // false
System.out.println(checkValidDate("20241301000000")); // false
System.out.println(checkValidDate("20240132000000")); // false
System.out.println(checkValidDate("20240101240000")); // false
}
}
NumberFormatException。import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public static boolean checkValidDateJava8(String s) {
try {
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime.parse(s, f); // 嚴格解析,非法拋 DateTimeParseException
return true;
} catch (DateTimeParseException e) {
return false;
}
}
java.time API 線程安全、不可變、語義更清晰,推薦新項目使用。
利用 Calendar.setLenient(false) 是舊版 Java 校驗日期合法性的經典技巧;Java 8+ 建議直接用 LocalDateTime.parse。核心在於「讓庫拋異常」而非手寫複雜判斷邏輯,減少 Bug 且自動覆蓋閏年、月份天數等邊界情況。