date('Y-m-d H:i:s') 輸出的時間比服務器系統時間早/晚 8 小時(通常為 UTC vs CST 差值)。
PHP 5.1+ 要求腳本**必須**顯式設置時區,否則默認使用 UTC。date()、time()、strtotime() 等所有日期時間函數均受影響。
; 找到 [Date] 區段
date.timezone = Asia/Shanghai
; 或 PRC(中國標準時間別名)
修改後 **重啟 PHP-FPM / Apache**。
<?php
// 腳本最頂部,任何 date/time 函數調用之前
date_default_timezone_set('Asia/Shanghai'); // 或 'PRC'
echo date('Y-m-d H:i:s'); // 正確輸出本地時間
ini_set('date.timezone', 'Asia/Shanghai');
| 地區 | 標識符 | 別名 |
|---|---|---|
| 中國大陸 | Asia/Shanghai | PRC, Asia/Chongqing, Asia/Harbin |
| 中國香港 | Asia/Hong_Kong | |
| 中國台灣 | Asia/Taipei | |
| 新加坡 | Asia/Singapore | |
| UTC | UTC | GMT |
完整列表見 PHP 官方時區列表。
<?php
date_default_timezone_set('Asia/Shanghai');
echo 'date.timezone ini: ' . ini_get('date.timezone') . PHP_EOL;
echo 'date(): ' . date('Y-m-d H:i:s') . PHP_EOL;
echo 'time(): ' . time() . PHP_EOL;
echo 'strtotime("now"): ' . strtotime('now') . PHP_EOL;
$dt = new DateTime();
echo 'DateTime: ' . $dt->format('Y-m-d H:i:s') . PHP_EOL;
$dt = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
echo $dt->format('Y-m-d H:i:s');
// 時區轉換
$utc = new DateTime('now', new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $utc->format('Y-m-d H:i:s');
ENV TZ=Asia/Shanghai 或掛載 /etc/timezone、/etc/localtime。SET time_zone = '+08:00' 或 PDO MYSQL_ATTR_INIT_COMMAND。「相差 8 小時」= 未設置時區導致默認 UTC。在 **腳本入口第一行** 加上 date_default_timezone_set('Asia/Shanghai') 或配置 php.ini,問題即刻解決。