首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Java 日期時間校驗(yyyyMMddHHmmss 格式)

     編輯:關於C語言

需求

驗證字符串是否為合法的 yyyyMMddHHmmss 格式日期時間(如 20240115143025),包含年月日時分秒範圍合法性(閏年、大小月、24小時制等)。

核心思路:Calendar.setLenient(false)

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
    }
}

關鍵點解析

  • 長度檢查:先判 14 位,避免 substring 越界。
  • Integer.parseInt:自動處理前導零;非數字拋 NumberFormatException。
  • month - 1:Calendar 月份 0~11 對應 1~12 月。
  • 兩次 set:第一次只設年月日,第二次完整設時分秒;也可合併為一次完整 set。
  • getTime():將內部字段規範化並生成 Date 對象,此時會執行嚴格校驗。
  • 捕獲 Exception:涵蓋 NumberFormatException、IllegalArgumentException、IndexOutOfBoundsException 等。

替代方案(Java 8+)

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 且自動覆蓋閏年、月份天數等邊界情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved