<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>