| 函數 | 說明 | 受 date.timezone 影響 | 典型用途 |
|---|---|---|---|
date() | 格式化本地時間 | 是 | 顯示給使用者看的時間 |
gmdate() | 格式化 GMT/UTC 時間 | 否 | 儲存、API 傳輸、跨時區計算 |
// 假設當前 UTC 時間 2007-03-14 04:15:27
date_default_timezone_set('Asia/Taipei'); // UTC+8
echo date('Y-m-d H:i:s'); // 2007-03-14 12:15:27 (本地時間)
echo gmdate('Y-m-d H:i:s'); // 2007-03-14 04:15:27 (UTC 時間)
關鍵發現:在 Windows + PHP 環境下,date() 預設也會回傳 UTC,導致跨平台行為不一致。
// 統一取得「使用者時區」的時間
$userOffset = 8 * 3600; // 秒數,例如 +8 區
echo gmdate('Y-m-d H:i:s', time() + $userOffset);
// 輸出:2007-03-14 12:15:27 (在任何作業系統皆一致)
優點:資料庫只存 time()(UTC 時間戳),前端依使用者設定時區動態換算,完美支援全球化應用。
date.timezone = "Asia/Taipei"
// 或 "Asia/Shanghai", "PRC", "Etc/GMT-8"
date_default_timezone_set('Asia/Taipei'); // 推薦
// date_default_timezone_set('PRC');
echo date('Y-m-d H:i:s'); // 直接輸出正確本地時間
<?php
// 測試環境:預設 UTC
date_default_timezone_set('Etc/GMT');
echo "time(): " . time() . "\n"; // 1276257131 (UTC 時間戳)
echo "date(): " . date('Y-m-d H:i:s') . "\n"; // 2010-06-11 11:52:11 (UTC)
echo "gmdate(): " . gmdate('Y-m-d H:i:s') . "\n"; // 2010-06-11 11:52:11 (UTC)
echo "\n---\n";
// 切換到 PRC (UTC+8)
date_default_timezone_set('PRC');
echo "time(): " . time() . "\n"; // 1276257131 (不變!)
echo "date(): " . date('Y-m-d H:i:s') . "\n"; // 2010-06-11 19:52:11 (本地+8)
echo "gmdate(): " . gmdate('Y-m-d H:i:s') . "\n"; // 2010-06-11 11:52:11 (仍為UTC)
<?php
date_default_timezone_set('Etc/GMT');
echo strtotime('1970-01-01 08:00:00'); // 28800 (把輸入視為 UTC+8,換算回 UTC)
date_default_timezone_set('PRC');
echo strtotime('1970-01-01 08:00:00'); // 0 (輸入視為本地 PRC,即 UTC+8,換算回 UTC 為 0)
strtotime() 會依當前 PHP 時區設定解析字串,再轉為 UTC 時間戳。
TIMESTAMP 或 BIGINT 存 time()。date_default_timezone_set('Asia/Taipei')。DateTime + DateTimeZone 物件導向做法(PHP 5.2+)。$utc = new DateTime('now', new DateTimeZone('UTC'));
$taipei = clone $utc;
$taipei->setTimezone(new DateTimeZone('Asia/Taipei'));
echo "UTC: " . $utc->format('Y-m-d H:i:s') . "\n";
echo "Taipei: " . $taipei->format('Y-m-d H:i:s') . "\n";
// 使用者自訂時區
$userTz = new DateTimeZone('America/New_York');
$userTime = clone $utc;
$userTime->setTimezone($userTz);
echo "New York: " . $userTime->format('Y-m-d H:i:s');