必须将config/app.php的timezone改为'asia/shanghai'并执行php artisan config:clear,否则admin:install生成的时间全为utc,导致数据错乱;同时需统一mysql服务端、php连接层及.env中的时区配置。

laravel-admin安装前必须改config/app.php里的timezone
不改就装,php artisan admin:install 生成的管理员创建时间、日志记录时间、表单默认日期控件值全都会是 UTC 时间,后续查数据或导出 Excel 时容易错乱。Laravel 默认是 'timezone' => 'UTC',而 laravel-admin 的迁移脚本和前端时间组件都隐式依赖应用级时区,不是靠 Carbon 动态转就能兜底的。
正确做法是直接编辑 config/app.php,把这一行改成:
'timezone' => 'Asia/Shanghai',
注意别写 PRC 或 GMT+8 —— 虽然 Laravel 兼容这些写法,但部分 MySQL 版本(尤其是 5.7 及以下)在执行 admin:install 时会因时区名解析失败导致迁移中断;Asia/Shanghai 是 IANA 标准名,兼容性最稳。
数据库连接也要同步设时区,否则admin:install建表失败
laravel-admin 安装过程会执行多条带时间戳的 SQL 插入(比如初始化 admin_users 表),如果 MySQL 服务端时区和 PHP 应用不一致,可能触发 Invalid datetime format 或插入 0000-00-00 00:00:00。
检查并统一三处:
-
.env中确保DB_TIMEZONE=+08:00(MySQL 8.0+ 支持)或留空(走系统默认) - MySQL 服务端配置:运行
SELECT @@global.time_zone, @@session.time_zone;,如果不是+08:00或SYSTEM,需在my.cnf加default-time-zone = '+08:00'并重启 - PHP 连接层:在
config/database.php的mysql配置里加'options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone = '+08:00';"]
用户登录后看到的时间还是 UTC?检查admin.php是否覆盖了时区
laravel-admin 自己的配置文件 config/admin.php 里有个 date_format 和 time_format,但它不控制底层时区,只影响前端显示格式。真正起作用的是 Laravel 的 app.timezone —— 如果你装完发现后台列表里创建时间仍是 2026-08-17 08:24:00(UTC),说明 config/app.php 没生效,常见原因:
- 缓存没清:
php artisan config:clear必须执行,否则config/app.php修改被 opcache 或 config cache 拦截 - 环境变量干扰:
.env里写了APP_TIMEZONE=UTC,会覆盖config/app.php;删掉这行或改成APP_TIMEZONE=Asia/Shanghai - 中间件误设:某些自定义中间件调用了
date_default_timezone_set('UTC'),得排查app/Http/Middleware下所有中间件
想让每个用户按自己时区看时间?别动app.timezone
全局改 app.timezone 是为 laravel-admin 安装和基础功能服务的,不是给多时区用户设计的方案。真要支持用户自选时区,得另起一套逻辑:
- 在
users表加timezone字段(类型varchar(32)),存Asia/Shanghai这类标准名 - 写中间件,在请求进入时读取当前用户
timezone,然后调用date_default_timezone_set($user->timezone) - 注意:这个操作不能在
AppServiceProvider::boot()里做,因为那时用户未认证;必须放在认证后的中间件中 - 前端时间展示统一用
Carbon::parse($model->created_at)->tz($user->timezone)->format(...),别依赖 Blade 模板自动转换
装 laravel-admin 时最常被忽略的,其实是改完 config/app.php 后忘了清缓存,结果反复重装三次才发现时间还是错的 —— config:clear 这一步,比重跑 admin:install 更关键。











