date() 是 PHP 處理日期時間最核心的函數,將 Unix 時間戳格式化為人類可讀字串。掌握格式字元、時區處理、常見陷阱,能高效解決各類時間顯示需求。
date(string $format, int $timestamp = time()): string
$format:格式字串(必填)$timestamp:Unix 時間戳(選填,預設為當前 time())| 字元 | 說明 | 範例 |
|---|---|---|
| Y | 4位數年份 | 2024 |
| y | 2位數年份 | 24 |
| m | 月份(有前導零) | 01-12 |
| n | 月份(無前導零) | 1-12 |
| F | 月份完整名稱 | January |
| M | 月份縮寫 | Jan |
| d | 日期(有前導零) | 01-31 |
| j | 日期(無前導零) | 1-31 |
| l | 星期完整名稱 | Monday |
| D | 星期縮寫 | Mon |
| w | 星期數字 | 0(日)-6(六) |
| N | ISO-8601 星期 | 1(一)-7(日) |
| H | 24小時制(有前導零) | 00-23 |
| G | 24小時制(無前導零) | 0-23 |
| h | 12小時制(有前導零) | 01-12 |
| g | 12小時制(無前導零) | 1-12 |
| i | 分鐘(有前導零) | 00-59 |
| s | 秒數(有前導零) | 00-59 |
| u | 微秒 | 000000 |
| a | am/pm 小寫 | am |
| A | AM/PM 大寫 | PM |
| z | 年間第幾天 | 0-365 |
| W | ISO-8601 週數 | 42 |
| t | 該月天數 | 28-31 |
| L | 是否閏年 | 1/0 |
| c | ISO 8601 格式 | 2024-01-15T14:30:00+08:00 |
| r | RFC 2822 格式 | Mon, 15 Jan 2024 14:30:00 +0800 |
| U | Unix 時間戳 | 1705300200 |
<?php
$now = time();
echo date("Y-m-d", $now); // 2024-01-15
echo date("Y/m/d H:i:s", $now); // 2024/01/15 14:30:00
echo date("Y年m月d日 l", $now); // 2024年01月15日 Monday
echo date("c", $now); // 2024-01-15T14:30:00+08:00 (ISO 8601)
echo date("r", $now); // Mon, 15 Jan 2024 14:30:00 +0800 (RFC 2822)
echo date("U", $now); // 1705300200 (時間戳)
?>
PHP 預設時區可能非預期值,必須明確設定:
<?php
// 方法 1:php.ini 設定
// date.timezone = "Asia/Taipei"
// 方法 2:腳本開頭設定(推薦)
date_default_timezone_set('Asia/Taipei');
// 方法 3:ini_set
ini_set('date.timezone', 'Asia/Taipei');
// 驗證
echo date_default_timezone_get(); // Asia/Taipei
echo date('Y-m-d H:i:s T'); // 2024-01-15 14:30:00 CST
?>
常用時區識別碼:Asia/Taipei、Asia/Shanghai、Asia/Hong_Kong、UTC、America/New_York、Europe/London。
將英文文字日期描述解析為 Unix 時間戳。
<?php
echo strtotime("now"); // 當前時間戳
echo strtotime("+1 day"); // 明天這個時間
echo strtotime("next Monday"); // 下週一
echo strtotime("last day of February 2024"); // 2024-02-29
echo strtotime("2024-12-25"); // 指定日期
echo strtotime("-2 weeks"); // 兩週前
// 結合 date()
echo date("Y-m-d", strtotime("+1 month")); // 下個月今天
?>
PHP 5.2+ 提供 DateTime,功能更強大、處理時區更直觀、支援微秒。
<?php
// 建立
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
$dt2 = DateTime::createFromFormat('Y-m-d', '2024-12-25');
// 格式化
echo $dt->format('Y-m-d H:i:s');
echo $dt->format('c');
// 修改
$dt->modify('+1 week');
$dt->add(new DateInterval('P3D')); // 加 3 天
$dt->sub(new DateInterval('P1M')); // 減 1 月
// 比較
$diff = $dt1->diff($dt2);
echo $diff->days . " 天差異";
echo $diff->format('%R%a 天');
// 時區轉換
$dt->setTimezone(new DateTimeZone('UTC'));
echo $dt->format('c');
?>
function calculateAge($birthDate) {
$birth = new DateTime($birthDate);
$today = new DateTime('today');
$diff = $birth->diff($today);
return $diff->y;
}
echo calculateAge('1990-05-15'); // 33 (視當前日期)
$firstDay = date('Y-m-01');
$lastDay = date('Y-m-t');
// 或
$dt = new DateTime('first day of this month');
$dtEnd = new DateTime('last day of this month');
function isToday($timestamp) {
return date('Y-m-d', $timestamp) === date('Y-m-d');
}
function isThisWeek($timestamp) {
return date('o-W', $timestamp) === date('o-W');
// 'o' 為 ISO 年份,配合 'W' 週數
}
function timeAgo($timestamp) {
$diff = time() - $timestamp;
if ($diff < 60) return "剛剛";
if ($diff < 3600) return floor($diff/60) . " 分鐘前";
if ($diff < 86400) return floor($diff/3600) . " 小時前";
if ($diff < 604800) return floor($diff/86400) . " 天前";
return date('Y-m-d', $timestamp);
}
$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s.u'); // 2024-01-15 14:30:00.123456
// date('u') 永遠回傳 000000
DateTime::format('u') 或 microtime(true)02/03/2024 美式為 3月2日,歐式為 2月3日。建議使用 ISO 格式 2024-03-02 或 DateTime::createFromFormat()DateTime 內建處理,手動計算易出錯time() 結果DateTime 物件重用日期時間處理看似簡單,實則涉及時區、語系、曆法、閏年等複雜性。善用 DateTime 類別、明確設定時區、避免手動運算,是構建可靠時間功能的關鍵。