最稳妥方法是直接修改 php.ini 中的 date.timezone = asia/shanghai 并完整重启 apache;php 8.0+ 已废弃 prc,cst 会被误判为美国中部时间,唯一推荐标准时区名为 asia/shanghai。

怎么在 XAMPP 里改 PHP 时区为上海
直接改 php.ini 最稳妥,但必须重启 Apache 才生效——很多人改完没反应,就是因为只点了 reload 或根本没重启服务。
操作路径(Windows XAMPP):C:\xampp\php\php.ini;Linux/macOS 则看控制面板里 “Config → php(php.ini)” 打开的文件路径,别凭经验乱找。
找到这一行:;date.timezone =,去掉前面的分号,改成:date.timezone = Asia/Shanghai(等号前后不能有空格,值不加引号)。
改完保存,回到 XAMPP 控制面板,先点 Stop 再点 Start Apache(MySQL 不用停,但 Apache 必须完整重启)。
为什么 date_default_timezone_set('Asia/Shanghai') 有时不生效
它只对当前脚本有效,且必须在任何时间函数调用前执行。常见失效场景:
- 放在
index.php中间或底部,但前面已有date()或strtotime()调用 - 框架已自动加载了其他文件(比如 Composer autoloader、配置引导),那些文件里可能提前用了时间函数
- CLI 模式下运行脚本,却只改了 Apache 版本的
php.ini,而 CLI 用的是另一份(C:\xampp\php\php-cli.ini或php -i | grep "Loaded Configuration File"查)
验证是否生效:在脚本开头加一行 echo date_default_timezone_get();,输出必须是 Asia/Shanghai,不是 UTC、空字符串,也不是 CST(那是美国中部时间)。
PRC 和 Asia/Shanghai 能混用吗
不能。虽然旧版 PHP 支持 PRC,但它在 PHP 8.0+ 已被标记为废弃,date_default_timezone_set('PRC') 会触发 E_DEPRECATED 警告,且某些容器或云环境可能直接拒绝。
CST 更危险:PHP 解析为 America/Chicago(UTC-6),不是中国标准时间(UTC+8)。实测:date_default_timezone_set('CST'); echo date('H:i:s'); 输出比北京时间慢 14 小时。
唯一推荐写法:Asia/Shanghai。这是 IANA 时区数据库标准名,全版本兼容,无歧义。
框架项目里要不要再设一次时区
要,但方式得换——别再依赖全局时区。
比如 Laravel 的 config/app.php 里设 'timezone' => 'Asia/Shanghai',只影响 Eloquent 时间戳、日志格式等框架行为,不影响 date() 函数本身;ThinkPHP、CodeIgniter 同理。
真正安全的做法是:存储用 UTC,展示才转本地时区。例如:
$dt = new DateTime('2026-04-26 11:48:00', new DateTimeZone('UTC'));
$dt->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $dt->format('Y-m-d H:i:s'); // 输出上海时间
这样既避免全局污染,也防止日志或 API 返回时间错乱。XAMPP 本地开发时尤其要注意这点——服务器和本地系统时区不一致,硬设全局容易埋坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











