最常用方式是在脚本开头调用date_default_timezone_set('asia/shanghai'),需使用iana标识符;也可修改php.ini的date.timezone、.htaccess或nginx fastcgi_param;须用date('y-m-d h:i:s t e')验证生效。

PHP代码中用 date_default_timezone_set() 设置时区
在脚本开头调用 date_default_timezone_set() 是最常用、最直接的方式,它会覆盖 php.ini 的默认设置,且只影响当前请求生命周期。
常见错误是传入无效时区名(如 "GMT+8" 或 "CST"),这会导致警告甚至时间计算错误。必须使用 IANA 时区标识符,例如:
date_default_timezone_set('Asia/Shanghai');
其他常用值:'UTC'、'America/New_York'、'Europe/London'。可用 timezone_identifiers_list() 查看全部支持列表。
注意:如果已在 php.ini 中设定了 date.timezone,此处再设不会报错,但会以代码中的为准;若函数调用失败(如参数非法),后续 date()、strtotime() 等将回退到 UTC 并触发 E_WARNING。
立即学习“PHP免费学习笔记(深入)”;
修改 php.ini 配置文件全局生效
适用于所有 PHP 脚本,无需每处重复写代码,但需要重启 Web 服务或 PHP-FPM 才能生效。
找到正在使用的 php.ini 文件(通过 phpinfo() 查看 Loaded Configuration File 路径),取消注释并修改这一行:
date.timezone = "Asia/Shanghai"
不要加空格、引号类型不限(双引号/单引号均可,但推荐双引号),值必须是合法时区字符串。若留空或拼写错误,PHP 启动时不会报错,但运行时调用时间函数会发出警告:
Warning: date(): It is not safe to rely on the system's timezone settings...
多个环境共用一份 php.ini 时,容易误改成其他时区(比如开发机设了 UTC,上线后忘记改回 Asia/Shanghai),建议配合部署脚本校验该配置项。
Apache 或 Nginx 下通过 .htaccess 或 fastcgi_param 覆盖
适合无法修改 php.ini 的共享主机,或需按虚拟主机区分时区的场景。
Apache 用户可在项目根目录 .htaccess 中添加:
php_value date.timezone "Asia/Shanghai"
Nginx + PHP-FPM 用户则需在 server 块中加入:
fastcgi_param PHP_VALUE "date.timezone=Asia/Shanghai";
注意:Apache 必须启用 AllowOverride Options 才允许 .htaccess 生效;Nginx 的 PHP_VALUE 方式在较新版本中可能被禁用(取决于 security.limit_extensions 和 PHP 编译选项),且不支持数组类配置项。
这类方式优先级高于 php.ini,但低于脚本内 date_default_timezone_set() —— 也就是说,代码里再调一次函数仍会覆盖它。
验证时区是否真正生效
光看配置不等于成功,得用实际输出确认。最简单的验证方式:
echo date('Y-m-d H:i:s T e'); // 输出类似:2024-06-15 14:23:05 CST Asia/Shanghai
重点检查最后两个字段:T 是缩写(如 CST、UTC),e 是完整时区标识符。两者必须匹配你设定的值。
另一个易忽略点:Laravel、ThinkPHP 等框架通常在启动阶段就调用了 date_default_timezone_set(),此时你在控制器里再设一次,可能被框架重置或冲突。建议统一在框架配置文件中设置(如 Laravel 的 config/app.php 中的 'timezone' 项),而非手动干预底层函数。
时区不是“设完就稳”,尤其跨服务器、跨容器、跨云厂商时,系统时钟、PHP 配置、数据库连接时区三者常不一致,调试时得逐层查。











