PHP Date/Time 函數完整指南:日期時間處理大全
簡介
Date/Time 函數讓您從伺服器取得日期時間,並以多種格式輸出。注意:這些函數依賴伺服器的本地設定,使用時請考量夏令時間與閏年。PHP 5.2 起引入 DateTime 物件導向介面,功能更強大。
執行期設定 (php.ini)
| 指令 | 說明 | 預設值 | PHP 版本 |
| date.timezone | 所有日期時間函數使用的預設時區 | "" | 5.1 |
| date.default_latitude | date_sunrise/sunset 預設緯度 | "31.7667" | 5.0 |
| date.default_longitude | date_sunrise/sunset 預設經度 | "35.2333" | 5.0 |
| date.sunrise_zenith | 預設日出天頂角 | "90.83" | 5.0 |
| date.sunset_zenith | 預設日落天頂角 | "90.83" | 5.0 |
建議:在 php.ini 或腳本開頭設定 date_default_timezone_set('Asia/Taipei') 避免警告。
程序式核心函數速查
| 函數 | 說明 |
date() | 格式化本地日期時間 (最常用) |
time() | 取得當前 Unix 時間戳 |
mktime() | 從日期參數取得 Unix 時間戳 |
strtotime() | 解析英文文字日期描述為時間戳 |
getdate() | 取得時間戳或當前的日期時間資訊陣列 |
checkdate() | 驗證格里高利日期有效性 |
gmdate() | 格式化 GMT/UTC 日期時間 |
gmmktime() | 取得 GMT 日期的 Unix 時間戳 |
strftime() | 依區域設定格式化本地日期時間 |
gmstrftime() | 依區域設定格式化 GMT/UTC 日期時間 |
microtime() | 取得微秒級時間戳 |
idate() | 格式化日期為整數 |
localtime() | 取得本地時間陣列 |
物件導向 DateTime 類別核心方法
| 方法 | 說明 |
new DateTime() / date_create() | 建立 DateTime 物件 |
date_create_from_format() | 依指定格式解析字串建立物件 |
format() / date_format() | 格式化輸出 |
modify() / date_modify() | 修改日期時間 (如 +1 day) |
add() / date_add() | 加上 DateInterval |
sub() / date_sub() | 減去 DateInterval |
diff() / date_diff() | 計算兩日期差值,返回 DateInterval |
setTimezone() / date_timezone_set() | 設定時區 |
getTimezone() / date_timezone_get() | 取得時區物件 |
getTimestamp() / date_timestamp_get() | 取得 Unix 時間戳 |
setTimestamp() / date_timestamp_set() | 從時間戳設定日期時間 |
DateInterval 與 DatePeriod
date_interval_create_from_date_string() — 從字串建立間隔 (如 2 days)
date_interval_format() — 格式化間隔輸出
new DatePeriod($start, $interval, $recurrences) — 產生週期性日期序列
常用格式化字元 (date() / DateTime::format())
| 字元 | 說明 | 範例 |
| Y | 四位數年份 | 2024 |
| m | 兩位數月份 | 01-12 |
| d | 兩位數日期 | 01-31 |
| H | 24小時制小時 | 00-23 |
| i | 分鐘 | 00-59 |
| s | 秒數 | 00-59 |
| u | 微秒 (PHP 5.2.2+) | 654321 |
| D | 星期幾縮寫 | Mon |
| l | 星期幾全名 | Monday |
| W | 年度第幾週 | 42 |
| t | 該月總天數 | 31 |
| O | 時差 (如 +0800) | +0800 |
| c | ISO 8601 格式 | 2024-01-15T10:30:00+08:00 |
| r | RFC 2822 格式 | Mon, 15 Jan 2024 10:30:00 +0800 |
預定義日期常數
DATE_ATOM — Atom (2005-08-15T16:13:03+0000)
DATE_COOKIE — HTTP Cookie (Sun, 14 Aug 2005 16:13:03 UTC)
DATE_ISO8601 — ISO-8601
DATE_RFC822 / DATE_RFC850 / DATE_RFC1036 / DATE_RFC1123 / DATE_RFC2822
DATE_RSS — RSS
DATE_W3C — W3C
實用範例
1. 設定時區並輸出當前時間
<?php
date_default_timezone_set('Asia/Taipei');
echo date('Y-m-d H:i:s') . '<br>'; // 2024-01-15 10:30:00
?>
2. 計算兩日期差距
<?php
$start = new DateTime('2024-01-01');
$end = new DateTime('2024-01-15');
$diff = $start->diff($end);
echo $diff->format('%a 天 %h 小時 %i 分鐘'); // 14 天 0 小時 0 分鐘
?>
3. 解析使用者輸入日期
<?php
$input = '15/01/2024';
$dt = DateTime::createFromFormat('d/m/Y', $input);
if ($dt) {
echo $dt->format('Y-m-d');
} else {
echo '格式錯誤';
}
?>
4. 產生未來 5 個週五
<?php
$period = new DatePeriod(
new DateTime('next friday'),
new DateInterval('P1W'),
5
);
foreach ($period as $dt) {
echo $dt->format('Y-m-d') . '<br>';
}
?>
關鍵建議
- 新專案優先使用
DateTime 物件導向介面,功能更完整、時區處理更安全。
- 儲存資料庫時統一使用 UTC (
DATE_ATOM 或時間戳),顯示時再轉換使用者時區。
- 避免直接操作時間戳進行日期運算,改用
DateInterval / modify() 避免夏令時間陷阱。