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

PHP 正則匹配日期時間完全指南:從基礎驗證到數據庫批量提取轉換

     編輯:PHP 相關知識

核心正則模式

1. 標準格式驗證:YYYY-MM-DD [HH:MM:SS]

$pattern = '/^\d{4}[-](0?[1-9]|1[0-2])[-](0?[1-9]|[12]\d|3[01])' .
           '(\s+(0?\d|1\d|2[0-3]):(0?\d|[1-5]\d):(0?\d|[1-5]\d))?$/';

$time = '2012-02-16 23:59:59';
if (preg_match($pattern, $time)) {
    echo strtotime($time); // 1329407999
} else {
    echo '格式錯誤';
}

正則結構解析

  • ^\d{4}:4位年份開頭
  • [-]:分隔符連字符
  • (0?[1-9]|1[0-2]):月份 1-12,可選前導 0
  • (0?[1-9]|[12]\d|3[01]):日期 1-31
  • (\s+(0?\d|1\d|2[0-3]):(0?\d|[1-5]\d):(0?\d|[1-5]\d))?:可選時間部分(時:分:秒)
  • $:字符串結尾

2. 兼容多種分隔符:/ 或 -

// 僅匹配日期
preg_match_all('/\d{4}[-\/]\d{2}[-\/]\d{2}/', $str, $dates);

// 匹配日期+時間
preg_match_all('/\d{4}[-\/]\d{2}[-\/]\d{2}\s+\d{2}:\d{2}:\d{2}/', $str, $datetimes);

實戰:從混合文本批量提取並轉時間戳

$text = "嘿嘿2010/07/08 12:31:56哈哈1999-12-31 13:21:45";

// 統一提取:支持 / 或 - 分隔
preg_match_all('/\d{4}[-\/]\d{2}[-\/]\d{2}(?:\s+\d{2}:\d{2}:\d{2})?/', $text, $matches);

foreach ($matches[0] as $dt) {
    // 統一分隔符為 - 便于 strtotime 解析
    $dt = str_replace('/', '-', $dt);
    $ts = strtotime($dt);
    echo "$dt => $ts\n";
}

/* 輸出:
2010-07-08 12:31:56 => 1278563516
1999-12-31 13:21:45 => 946627305
*/

進階:蔡勒公式計算星期(突破 1970-2038 年限制)

PHP date() 受 32 位系統限制,只能處理 1970-2038 年。蔡勒公式可計算任意年份星期:

function getWeekZeller($year, $month, $day) {
    if ($month < 3) {
        $month += 12;
        $year--;
    }
    $c = (int)($year / 100);
    $y = $year % 100;
    $w = ($y + (int)($y/4) + (int)($c/4) - 2*$c + (int)(26*($month+1)/10) + $day - 1) % 7;
    return ($w + 7) % 7; // 0=周日, 1=周一...
}

// 測試 2049-10-01 (建國100周年)
echo getWeekZeller(2049, 10, 1); // 5 = 星期五

現代化最佳實踐:DateTime 類

$dt = DateTime::createFromFormat('Y-m-d H:i:s', '2012-02-16 23:59:59');
if ($dt) {
    echo $dt->getTimestamp(); // 1329407999
    echo $dt->format('l');    // Thursday
    echo $dt->format('w');    // 4 (0=周日)
}

// 支持 64 位系統任意年份
$dt = new DateTime('2049-10-01');
echo $dt->format('l'); // Friday

總結建議

  • 驗證輸入:用嚴格正則確保格式合法
  • 提取文本:寬鬆正則 + str_replace('/', '-', ...) 統一格式
  • 轉換計算:優先 DateTime 類(PHP 5.2+),跨平台、無年份限制、功能豐富
  • 舊系統兼容:32 位環境下 strtotime 配合蔡勒公式補足
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved