php 7 必须显式设置合法时区,否则时间函数直接抛出 fatal error;推荐在 php.ini 中配置 date.timezone = "asia/shanghai" 并重启服务,或在每个入口脚本顶端调用 date_default_timezone_set()。

PHP 7 必须显式设置时区,否则 date()、strtotime()、DateTime 等函数直接抛出 Fatal error,脚本中断——不是警告,是立刻崩。
php.ini 中配置 date.timezone 是最稳妥的方式
优先改服务器级配置,一劳永逸。找到你的 php.ini 文件(可通过 php --ini 或 phpinfo() 查看路径),取消注释并填写真实时区:
date.timezone = "Asia/Shanghai"
注意:"PRC"、"GMT+8"、"UTC+8" 这类非标准写法在 PHP 7 下会返回 false,触发错误;必须用 PHP 官方时区列表中的完整标识符,比如 "Asia/Shanghai" 或 "Europe/London"。
改完记得重启 Web 服务(如 systemctl restart php-fpm 或 nginx)或 Web 服务器(如 Apache)。
无法修改 php.ini 时,必须在入口脚本最顶端调用 date_default_timezone_set()
共享主机、Docker 容器无权限改配置时,只能代码补救。但有严格限制:
- 必须放在所有时间相关函数调用之前(
date()、strtotime()、new DateTime()都算) - 必须在全局作用域,不能包在函数、条件块或
include里 - 必须每个入口脚本都加(
index.php、api.php、CLI 脚本等)
示例(正确):
<?php date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s'); // ✅ 安全示例(错误):
<?php echo date('Y-m-d'); // ❌ 这里就已报错
date_default_timezone_set('Asia/Shanghai');检查时区是否生效,别信“好像对了”
光看输出时间不等于时区设对了。用这两个函数交叉验证:
-
date_default_timezone_get():返回当前生效的时区字符串,应与你设的一致(如"Asia/Shanghai") -
ini_get('date.timezone'):返回php.ini中的配置值,为空说明没配或配错位置
执行这段代码就能快速诊断:
<?php echo "get: " . date_default_timezone_get() . "\n";
echo "ini: " . ini_get('date.timezone') . "\n";如果第一行输出空或 "UTC",第二行为空,说明完全没生效。
时区设错或漏设导致的典型错误现象
这些不是“可能出错”,而是 PHP 7 下**必然出现**的问题:
-
Fatal error: Uncaught Error: Call to a member function format() on bool—— 因DateTime::createFromFormat()或strtotime()返回false,你没判空就直接调用format() -
Warning: strtotime(): It is not safe to rely on the system's timezone settings—— 这是 PHP 5 的警告,PHP 7 已升级为致命错误,不会出现这句,只会直接Fatal error - 同一页面中部分时间显示为 UTC、部分为本地时间 —— 原因是
date_default_timezone_set()被放在某个 include 文件里,或只在某个分支中执行,造成“局部生效”
真正麻烦的不是设不设,而是设的位置不对、设的值不合法、或者只设了一半入口。PHP 7 对时区的要求是硬性、全局、即时生效的——漏一个脚本,就崩一个请求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











