核心函數速查表
| 函數 | 用途 | 回傳值 | 常見用法 |
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())
| 字元 | 說明 | 範例 |
| Y | 4 位數年份 | 2024 |
| m | 月份 (01-12) | 01 |
| d | 日期 (01-31) | 15 |
| H | 24 小時制 (00-23) | 14 |
| i | 分鐘 (00-59) | 30 |
| s | 秒數 (00-59) | 05 |
| w | 星期 (0=星期日 .. 6=星期六) | 1 |
| D | 星期縮寫 (Mon..Sun) | Mon |
| l | 星期全名 | Monday |
| t | 當月天數 | 31 |
| U | Unix 時間戳 | 1705305005 |
| c | ISO 8601 格式 | 2024-01-15T14:30:05+08:00 |
| r | RFC 2822 格式 | Mon, 15 Jan 2024 14:30:05 +0800 |
最佳實踐建議
- 腳本開頭 呼叫
date_default_timezone_set('UTC') 或應用程式基準時區。
- 資料庫儲存 統一用 UTC (TIMESTAMP 或 BIGINT Unix timestamp)。
- 複雜運算 (加減月份、處理閏年、時區轉換) 改用
DateTime + DateInterval + DateTimeZone 物件導向 API,避免 strtotime 模糊語義導致 Bug。
- 效能測量 使用
microtime(true) 取得浮點數秒。
- 輸出給前端 採用 ISO 8601 (
date('c')),JavaScript new Date() 可直接解析。