<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 本文示例程序僅用於演示如何在 PHP 中處理 date_default_timezone_get() 與 strtotime() 搭配使用時的時區問題。</span></span><span>
</span><span><span class="hljs-comment">// 由于前面的注释部分與正文内容无关,因此使用水平線分隔。</span></span><span>
</span><span><span class="hljs-comment">// ------------------------------------------------------------</span></span><span>
<span class="hljs-comment">/**
* 如何解決 date_default_timezone_get() 和 strtotime() 配合使用時的時區問題?
*
* 在 PHP 中,`date_default_timezone_get()` 用於獲取當前腳本運行環境下的默認時區,
* 而 `strtotime()` 則會在解析日期字符串時使用這個默認時區進行計算。
* 如果默認時區設置不當,就會導致日期時間解析出現偏差。
*
* **常見問題示例**
*
* ```php
* echo date_default_timezone_get(); // 可能輸出 UTC
* echo strtotime("2025-08-13 12:00:00"); // 結果會基於 UTC
* ```
*
* 這在開發和部署環境不一致時尤為常見,比如本地默認時區是 `Asia/Shanghai`,
* 但生產服務器可能是 `UTC`,從而導致解析結果相差數小時。
*
* **解決方法**
*
* 1. **顯式設置默認時區**
*
* 在腳本開始位置使用 `date_default_timezone_set()`,確保無論運行環境如何,時間解析始終一致。
*
* ```php
* date_default_timezone_set('Asia/Shanghai');
* $timestamp = strtotime("2025-08-13 12:00:00");
* echo date("Y-m-d H:i:s", $timestamp);
* ```
*
* 2. **在 strtotime 中使用帶時區的時間字符串**
*
* 如果不想全局改變默認時區,可以在傳給 `strtotime()` 的字符串中指定時區:
*
* ```php
* $timestamp = strtotime("2025-08-13 12:00:00 +08:00");
* echo date("Y-m-d H:i:s", $timestamp);
* ```
*
* 這樣即便默認時區是 `UTC`,也會正確解析為北京時間。
*
* 3. **結合 DateTime 對象使用**
*
* `DateTime` 對象提供了更靈活的時區控制,可以在實例化時直接傳入目標時區:
*
* ```php
* $dt = new DateTime("2025-08-13 12:00:00", new DateTimeZone("Asia/Shanghai"));
* echo $dt->getTimestamp();
* ```
*
* **總結**
*
* - `date_default_timezone_get()` 反映的是當前默認時區,不一定符合你預期的業務時區。
* - `strtotime()` 在解析字符串時完全依賴默認時區,除非字符串本身帶時區信息。
* - 最佳實踐是:要么全局設置時區,要么在每次解析時顯式傳入時區,避免因環境差異造成時間偏差。
*/</span>
</span></span>