最稳妥的方式是直接修改 php.ini 中的 date.timezone = "Asia/Shanghai" 并重启服务,全局生效且覆盖所有时间函数;运行时调用 date_default_timezone_set() 仅限当前脚本,存在兼容性和维护风险。

PHP本地环境怎样设置时区参数
直接改 php.ini 里的 date.timezone 是最稳妥的方式,其他方式(如 date_default_timezone_set())只影响当前脚本,无法覆盖所有时间相关函数的默认行为。
修改 php.ini 中的 date.timezone 配置项
这是全局生效、优先级最高、且对 date()、strtotime()、DateTime 构造等所有时间函数都起效的方式。
- 找到你实际在用的
php.ini文件:运行php --ini(CLI)或创建一个phpinfo();页面查看 “Loaded Configuration File” - 编辑该文件,取消注释并修改这一行:
date.timezone = "Asia/Shanghai"
- 重启 Web 服务(如 Apache 或 Nginx)或 PHP-FPM 进程,否则修改不生效
- 注意不要写成
GMT+8或UTC+8—— PHP 只接受 IANA 时区标识符,Asia/Shanghai才正确(PRC也行,但已废弃)
运行时用 date_default_timezone_set() 设置(仅限当前脚本)
适合开发调试、或无法修改 php.ini 的共享主机场景,但有明显局限性。
我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse: 你是PHP菜鸟,如果你: 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3
- 必须在任何时间函数调用前执行,例如放在入口文件第一行:
date_default_timezone_set('Asia/Shanghai'); - 它不会影响
gettimeofday()、microtime(true)等返回 Unix 时间戳的函数(这些本就不依赖时区) - 如果项目用了 Composer 自动加载 + 多入口(如 CLI 命令、Web 请求、定时任务),每个入口都得单独设置,漏一个就可能出错
- 某些扩展(如
intl的日期格式化)可能仍读取php.ini配置,导致行为不一致
常见错误现象和兼容性提醒
时区设错最典型的症状不是报错,而是时间差 8 小时、日志时间错乱、缓存过期提前/延后、数据库写入的 DATETIME 值与预期不符。
立即学习“PHP免费学习笔记(深入)”;
-
Warning: strtotime(): It is not safe to rely on the system's timezone settings—— 这说明date.timezone完全没设,PHP 正在 fallback 到系统时区(不可靠) - Windows 下若用
date.timezone = "Asia/Shanghai"报错,可临时换成"China/Standard_Time"(非标准,仅兼容旧版本),但强烈建议升级 PHP 或换 WSL - Docker 环境中,既要设容器内
php.ini,也要确认宿主机时区(/etc/timezone)不影响 PHP 启动时的初始化逻辑
Asia/Shanghai 并写进项目文档。










