日期時間處理是業務系統核心需求,PHP 提供豐富的函數族支援時間戳轉換、格式化輸出、驗證、運算等操作。本文系統整理核心函數與實戰模式。
| 函數 | 功能 | 回傳值 | 關鍵參數 |
|---|---|---|---|
time() | 當前 Unix 時間戳 | int (秒數) | 無 |
mktime() | 指定日期時間轉時間戳 | int / false | 時、分、秒、月、日、年 |
date() | 格式化時間戳為字串 | string | 格式字串、時間戳 |
getdate() | 時間戳解析為關聯陣列 | array | 時間戳 (預設 now) |
checkdate() | 驗證日期合法性 | bool | 月、日、年 |
strtotime() | 英文文本解析為時間戳 | int / false | 時間字串、基準時間 |
date_default_timezone_set() | 設定預設時區 | bool | 時區識別字 |
<?php
// 當前時間戳
echo time(); // 1704067200
// 格式化輸出
echo date('Y-m-d H:i:s', time()); // 2024-01-01 12:00:00
// 指定日期轉時間戳
$ts = mktime(12, 30, 0, 1, 1, 2024); // 2024-01-01 12:30:00
echo date('Y-m-d H:i:s', $ts);
?>
| 字符 | 含義 | 範例 |
|---|---|---|
| Y | 4 位數年 | 2024 |
| y | 2 位數年 | 24 |
| m | 月份 (01-12) | 01 |
| n | 月份 (1-12) | 1 |
| d | 日期 (01-31) | 01 |
| j | 日期 (1-31) | 1 |
| H | 24 小時 (00-23) | 12 |
| h | 12 小時 (01-12) | 12 |
| i | 分鐘 (00-59) | 30 |
| s | 秒 (00-59) | 00 |
| w | 星期 (0-6, 0=星期日) | 1 |
| z | 一年中的第幾天 (0-365) | 0 |
<?php
$arr = getdate();
echo "{$arr['year']}-{$arr['mon']}-{$arr['mday']}"; // 2024-1-1
echo "{$arr['hours']}:{$arr['minutes']}:{$arr['seconds']}"; // 12:30:00
echo "今天是一年中的第 {$arr['yday']} 天"; // 第 0 天
echo "星期{$arr['wday']}"; // 星期 1
echo "月份名稱:{$arr['month']}"; // January
?>
<?php
var_dump(checkdate(2, 29, 2024)); // true (閏年)
var_dump(checkdate(2, 29, 2023)); // false (平年)
var_dump(checkdate(13, 1, 2024)); // false (月份超範圍)
?>
<?php
echo strtotime('now'); // 當前時間戳
echo strtotime('+1 day'); // 明天這時
echo strtotime('next Monday'); // 下週一
echo strtotime('first day of next month'); // 下月 1 號
echo strtotime('2024-12-25 10:00:00'); // 指定格式
// 時間比較:必須轉時間戳
$t1 = strtotime('2024-01-01');
$t2 = strtotime('2024-12-31');
if ($t1 < $t2) echo 't1 早於 t2';
?>
<?php
$now = time();
$target = strtotime('2025-01-01 00:00:00');
$diff = $target - $now;
$days = floor($diff / 86400);
$hours = floor(($diff % 86400) / 3600);
$mins = floor(($diff % 3600) / 60);
$secs = $diff % 60;
echo "距離 2025 年還有 {$days} 天 {$hours} 時 {$mins} 分 {$secs} 秒";
?>
<?php
// 必須在日期函數前設定
date_default_timezone_set('Asia/Taipei'); // 或 PRC, Asia/Shanghai
echo date('Y-m-d H:i:s'); // 正確的本地時間
// 獲取所支援時區
print_r(DateTimeZone::listIdentifiers());
?>
<?php
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s');
$dt->modify('+1 week');
echo $dt->format('Y-m-d'); // 一週後
$diff = $dt->diff(new DateTime('2024-01-01'));
echo $diff->format('%a 天'); // 相差天數
// 不可變版本 (PHP 5.5+)
$dt = new DateTimeImmutable('now');
$nextWeek = $dt->modify('+1 week'); // 回傳新物件,原物件不變
?>
掌握時間戳與格式化的雙向轉換、時區設定、DateTime 物件導向操作,是處理複雜業務時間邏輯的基石。