PHP 預設時區為 **UTC**(協調世界時),中國標準時間(CST)為 **UTC+8**,直接使用 date()、time()、DateTime 會比本地時間少 8 小時。
; php.ini
date.timezone = "Asia/Shanghai"
; 或
date.timezone = "PRC"
php.ini 位置:php --ini 或 phpinfo()。date.timezone,取消註解並設定值。systemctl restart php8.1-fpm。php -r "echo date('Y-m-d H:i:s');" 輸出本地時間。優點:一次設定、全域生效、無程式碼入侵。
缺點:需服務器權限、修改後需重啟、容器化部署需重建映像或掛載配置。
<?php
// 必須在任何日期/時間函式呼叫**之前**執行
date_default_timezone_set('Asia/Shanghai');
// 或
date_default_timezone_set('PRC'); // 別名,效果相同
// 後續 date(), time(), new DateTime() 皆使用 CST
echo date('Y-m-d H:i:s'); // 正確顯示北京時間
優點:開發者可控、無需重啟、適合共享主機/無權限環境。
缺點:每個入口檔案/框架啟動檔都要寫、易遺漏導致不一致。
<?php
ini_set('date.timezone', 'Asia/Shanghai');
// 效果等同 date_default_timezone_set()
注意:ini_set 某些指令需 PHP_INI_ALL 權限,date.timezone 屬 PHP_INI_ALL,可運行期修改。
| 地區 | 識別碼 | 備註 |
|---|---|---|
| 中國大陸 | Asia/Shanghai | **推薦**,IANA 標準 |
| 中國大陸 | PRC | 別名,相容舊代碼 |
| 台灣 | Asia/Taipei | |
| 香港 | Asia/Hong_Kong | |
| 新加坡 | Asia/Singapore | |
| UTC | UTC | 基準時間 |
| 框架 | 設定位置 | 範例 |
|---|---|---|
| Laravel | config/app.php | 'timezone' => 'Asia/Shanghai', |
| Symfony | config/packages/framework.yaml | framework: { php_timezone: 'Asia/Shanghai' } |
| ThinkPHP | config/app.php | 'default_timezone' => 'Asia/Shanghai' |
| Yii2 | config/web.php (components) | 'formatter' => ['timeZone' => 'Asia/Shanghai'] |
date('e') 顯示 UTC。Dockerfile: ENV TZ=Asia/Shanghai + RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezonetime_zone 變數、connectionTimeZone (PDO) 需與 PHP 一致,建議**雙方皆用 UTC 存儲,顯示層轉換**。strtotime()、mktime() 受 date.timezone 影響,DateTime 建構子預設也受影響,DateTimeImmutable 同理。**生產環境首選:php.ini 設定 date.timezone = Asia/Shanghai + 容器環境變數 TZ=Asia/Shanghai**。
**開發/無權限環境**:入口檔第一行 date_default_timezone_set('Asia/Shanghai')。
**現代化開發**:棄用 date(),改用 DateTimeImmutable + 明確 DateTimeZone,資料庫存 UTC,顯示層按用戶時區轉換,徹底消除時區 Bug。