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

PHP 日期時間函數大全:checkdate、getdate、mktime、strtotime 等核心用法詳解

     編輯:PHP 綜合知識

核心函數速查表

函數用途回傳值常見用法
checkdate(m, d, y) 驗證格里曆日期合法性 bool 表單驗證、入庫前檢查
getdate(ts?) 取得日期/時間關聯陣列 array (含 year, mon, mday, hours, minutes, seconds, weekday, yday 等) 拆解時間戳為人類可讀元素
mktime(h, i, s, m, d, y) 由日期時間元素產生 Unix 時間戳 int (秒數,GMT 1970-01-01 起) 建立特定時間點、日期運算基準
date(fmt, ts?) 格式化時間戳為字串 string 顯示日期、產生檔名、記錄日誌
strtotime(str, now?) 解析英文文字日期為時間戳 int|false 相對時間計算、「明天」、「+1 week」
strftime(fmt, ts?) 依區域設定格式化 (需 setlocale) string 多語系月份/星期名稱
microtime(get_as_float?) 取得微秒級時間戳 string|float (秒.微秒) 效能測量、唯一 ID 產生
gmmktime(...) GMT 日期產生時間戳 int 跨時區儲存、UTC 基準運算
gmdate(fmt, ts?) 格式化為 GMT 日期字串 string API 回應、日誌統一用 UTC
date_default_timezone_set(tz) 設定腳本預設時區 (PHP 5.1+) bool 腳本開頭統一設定,避免警告

實戰範例

1. 日期驗證與表單處理

<?php
function validateBirthday($y, $m, $d) {
    if (!checkdate($m, $d, $y)) return false;
    $ts = mktime(0, 0, 0, $m, $d, $y);
    $now = time();
    if ($ts > $now) return false; // 未來日期
    $age = floor(($now - $ts) / (365.25 * 86400));
    return $age >= 18; // 成年檢查
}

// 使用
if (validateBirthday(2005, 2, 30)) { // false
    echo '合法';
} else {
    echo '不合法';
}
?>

2. 靈活的相對時間計算

<?php
date_default_timezone_set('Asia/Taipei');

$now = time();
echo '今天: ' . date('Y-m-d', $now) . "\n";
echo '明天: ' . date('Y-m-d', strtotime('tomorrow')) . "\n";
echo '下週一: ' . date('Y-m-d', strtotime('next Monday')) . "\n";
echo '3 天前: ' . date('Y-m-d', strtotime('-3 days')) . "\n";
echo '本月最後一天: ' . date('Y-m-d', strtotime('last day of this month')) . "\n";
echo '下月 15 號: ' . date('Y-m-d', strtotime('15th of next month')) . "\n";

// 避免 strtotime 模糊語義,精確運算建議用 DateTime
$dt = new DateTime('first day of next month');
echo 'DateTime: ' . $dt->format('Y-m-d') . "\n";
?>

3. 高效能計時與微秒記錄

<?php
$start = microtime(true);

// 模擬耗時操作
for ($i = 0; $i < 100000; $i++) {
    md5($i);
}

$end = microtime(true);
printf("耗時: %.4f 秒\n", $end - $start);
// 輸出: 耗時: 0.0123 秒
?>

4. 多語系日期顯示

<?php
// Linux 系統需安裝對應 locale: locale-gen zh_TW.UTF-8
setlocale(LC_TIME, 'zh_TW.UTF-8', 'Chinese_Taiwan.65001'); // Windows 相容

echo strftime('%Y 年 %m 月 %d 日 %A', time());
// 輸出: 2024 年 01 月 15 日 星期一
?>

5. 統一使用 UTC 儲存與運算

<?php
// 入口統一設定
date_default_timezone_set('UTC');

// 資料庫儲存: 使用 UTC 時間戳 (INT) 或 DATETIME (UTC)
// 顯示給用戶: 轉換至用戶時區
function displayForUser($utcTimestamp, $userTimezone = 'Asia/Taipei') {
    $dt = new DateTime('@' . $utcTimestamp); // @ 表示 Unix timestamp
    $dt->setTimezone(new DateTimeZone($userTimezone));
    return $dt->format('Y-m-d H:i:s T');
}

echo displayForUser(time()); // 2024-01-15 14:30:00 CST
?>

常見格式化字元對照 (date() / gmdate())

字元說明範例
Y4 位數年份2024
m月份 (01-12)01
d日期 (01-31)15
H24 小時制 (00-23)14
i分鐘 (00-59)30
s秒數 (00-59)05
w星期 (0=星期日 .. 6=星期六)1
D星期縮寫 (Mon..Sun)Mon
l星期全名Monday
t當月天數31
UUnix 時間戳1705305005
cISO 8601 格式2024-01-15T14:30:05+08:00
rRFC 2822 格式Mon, 15 Jan 2024 14:30:05 +0800

最佳實踐建議

  1. 腳本開頭 呼叫 date_default_timezone_set('UTC') 或應用程式基準時區。
  2. 資料庫儲存 統一用 UTC (TIMESTAMP 或 BIGINT Unix timestamp)。
  3. 複雜運算 (加減月份、處理閏年、時區轉換) 改用 DateTime + DateInterval + DateTimeZone 物件導向 API,避免 strtotime 模糊語義導致 Bug。
  4. 效能測量 使用 microtime(true) 取得浮點數秒。
  5. 輸出給前端 採用 ISO 8601 (date('c')),JavaScript new Date() 可直接解析。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved