在 PHP 開發中,判斷一個日期字串是否有效看似簡單,實則暗藏玄機。不僅要檢查格式是否正確(如 Y-m-d),更要驗證日期本身是否存在(例如 2013-02-29 格式正確但日期無效,而 2012-02-29 則完全有效)。若單純使用正則表達式,不僅難以維護,也難以涵蓋閏年、每月天數差異等邏輯。
這裡提供一個輕量級函數 checkDateIsValid(),核心邏輯只有兩步:
strtotime() 將字串轉為 Unix 時間戳;若失敗直接回傳 false(格式錯誤或無法解析)。Y-m-d、Y/m/d)再格式化一次,若與原字串完全一致,即視為有效日期。/**
* 檢查日期字串是否為有效日期
* @param string $date 待驗證日期字串
* @param array $formats 允許的格式陣列,預設支援 Y-m-d 與 Y/m/d
* @return bool
*/
function checkDateIsValid($date, $formats = array("Y-m-d", "Y/m/d")) {
$unixTime = strtotime($date);
if (!$unixTime) {
return false; // strtotime 解析失敗,格式不合法
}
// 只要符合任一允許格式即視為有效
foreach ($formats as $format) {
if (date($format, $unixTime) == $date) {
return true;
}
}
return false;
}
var_dump(checkDateIsValid("2013-09-10")); // true
var_dump(checkDateIsValid("2013-09-ha")); // false
var_dump(checkDateIsValid("2012-02-29")); // true (閏年)
var_dump(checkDateIsValid("2013-02-29")); // false (平年)
strtotime() 能解析的格式有限,若專案需支援極特殊格式(如 2023年05月01日),需自行擴充格式陣列或改用 DateTime::createFromFormat()。$formats 加入 H:i:s 等格式。這個做法避開了複雜正則,利用 PHP 內建日期解析引擎自動處理閏年、月份天數等邊界條件,程式碼簡潔且易維護,適合大多數專案場景。