php date() 时间错误主因是时区未设,默认按utc计算;应统一在php.ini设date.timezone=asia/shanghai,或脚本开头调date_default_timezone_set('asia/shanghai'),框架项目则改对应配置项。

PHP date() 输出时间不对,八成是时区没设
PHP 默认不设时区,date()、strtotime()、new DateTime() 全按 UTC 算——你本地显示“2024-05-10 02:00”,实际可能是北京时间的 10:00,差了八小时。
最直接的修复方式是在脚本开头加:date_default_timezone_set('Asia/Shanghai');
- 必须在所有时间函数调用前执行,放
date()后面就无效 - 值不能写错:
'PRC'已废弃,'Asia/Shanghai'是当前推荐写法 - 如果用 Composer 加载框架(如 Laravel),别在入口文件硬写,优先改配置(见下一条)
Laravel / Symfony 项目里改时区别碰 date_default_timezone_set()
框架自己管时区,硬设会和 config/app.php 的 'timezone' 冲突,导致 Carbon 和原生函数行为不一致。
网奇.NET网络商城系统是基于.Net平台开发的免费商城系统。功能强大,操作方便,设置简便。无需任何设置,上传到支持asp.net的主机空间即可使用。系统特色功能:1、同时支持Access和SqlServer数据库;2、支持多语言、多模板3、可定制缺货处理功能4、支持附件销售功能5、支持会员组批发功能6、提供页面设计API函数7、支持预付款功能8、配送价格分地区按数学公式计算9、商品支持多类别,可
- Laravel:只改
config/app.php里的'timezone' => 'Asia/Shanghai',别额外调date_default_timezone_set() - Symfony:在
.env设APP_TIMEZONE=Asia/Shanghai,或配framework.yaml中的default_timezone - 验证是否生效:
php -r "echo date_default_timezone_get();",不是框架配置项,而是 PHP 运行时实际生效的值
DateTime 构造时不指定时区,等于埋雷
new DateTime('2024-05-10') 看似简单,但没传时区参数时,它会用 date_default_timezone_get() 的结果——而这个值可能被前面某段代码悄悄改过,也可能根本没设(回退到 UTC)。
立即学习“PHP免费学习笔记(深入)”;
- 安全写法是显式传时区:
new DateTime('2024-05-10', new DateTimeZone('Asia/Shanghai')) - 数据库存时间戳(int)或 UTC 字符串时,构造
DateTime一定要带new DateTimeZone('UTC'),否则解析出来的时间对象内部时区是错的 - 用
DateTime::createFromFormat()也一样:第三个参数必须是DateTimeZone实例,不能是字符串
CLI 和 Web 请求时区可能不一致
你在浏览器里 date() 显示正确,但命令行跑 php artisan schedule:run 却差八小时?因为 CLI 模式读的是 php.ini 的 date.timezone,Web 模式可能被 ini_set() 或框架覆盖了。
- 查 CLI 当前时区:
php -r "echo date_default_timezone_get();" - 查 Web 当前时区:写个
phpinfo();页面看Date小节 - 统一方案:在系统级
php.ini里设date.timezone = Asia/Shanghai,比脚本里反复设更可靠 - 注意 Docker 环境:基础镜像常默认 UTC,得在
Dockerfile里ENV TZ=Asia/Shanghai并RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
DateTimeZone 是什么、date_default_timezone_get() 返回什么、PHP 进程启动时从哪读的配置。










