Docker部署Laravel+Nginx服务器时区异常:返回数据为UTC+0
Laravel+Docker 时区问题:数据库存储为莫斯科时区,但接口返回UTC+0
我在Docker中部署了Laravel+Nginx服务器,MariaDB数据库单独部署在同一服务器上,已将数据库设置为莫斯科时区(这是我需要的正确时区),数据存储正常,但从服务器返回的数据却是UTC+0时区。
已配置项
数据库配置(config/database.php)
'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'timezone' => '+3:00', 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
应用配置(config/app.php)
'timezone' => env('APP_TIMEZONE', 'Europe/Moscow'),
PHP配置(php.ini)
cgi.fix_pathinfo=0 max_execution_time = 1000 max_input_time = 1000 memory_limit=4G date.timezone = "Europe/Moscow"
排查与解决步骤
验证环境变量加载
检查.env文件是否添加APP_TIMEZONE=Europe/Moscow,进入Laravel容器执行php artisan tinker,分别输入date_default_timezone_get()和config('app.timezone'),确认返回值为Europe/Moscow。修正数据库时区配置
将数据库配置中的timezone值从'+3:00'改为'Europe/Moscow',使用时区标识符而非固定偏移量,避免夏令时切换导致的时区偏差。修改后配置:'timezone' => 'Europe/Moscow',检查模型日期转换规则
查看Laravel模型中的$casts属性,确保没有强制将日期字段转换为UTC格式。例如避免:protected $casts = [ 'created_at' => 'datetime:UTC', 'updated_at' => 'datetime:UTC', ];如需统一返回莫斯科时区的日期格式,可在模型中添加:
protected function serializeDate(DateTimeInterface $date) { return $date->format('Y-m-d H:i:s'); }同步Docker容器系统时区
进入Laravel容器执行date命令,确认系统时区为莫斯科时区。若不是,在Dockerfile中添加时区设置:RUN ln -snf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && echo Europe/Moscow > /etc/timezone重新构建并启动容器。
清除配置缓存
在Laravel容器内执行以下命令,确保新配置生效:php artisan config:clear php artisan cache:clear
内容的提问来源于stack exchange,提问作者Даниил Чернюк
相关产品推荐
相关产品推荐

