模型返回的时间和数据库中相差16小时

1. 运行环境

1). 当前使用的 Laravel 版本?

lumen 8.3.4

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.4.27
php-fpm 版本:7.4.27

3). 当前系统

Linux及windows10均出现该问题

2. 问题描述?

数据库是mysql5.7 字段用的是timestamp
模型用了自动时间

配置(.env)中设置了APP_TIMEZONE=PRC
写入一条数据,数据库中的数据和接口返回的数据相差16个小时,且与当前操作系统时间分别相差 -8 +8小时

如果把.env中时区改为UTC
则写入数据后数据库的时间与当前操作系统时间相同,但是接口返回时间差8小时(比当前时间早8小时)

3. 您期望得到的结果?

怎么样配置才能确保 接口(模型) 返回的时间及数据库查询到的时间一致,且和系统时间时间也一致

4. 您实际得到的结果?

当前系统实际时间(截图有2分钟时间差)
Laravel
数据库中数据的时间
Laravel
查询数据的接口返回
Laravel

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

DB_TIMEZONE=+08:00

3年前 评论
讨论数量: 5
数据库时区
laravel设置时区
服务器时区
当前时区
都看下
3年前 评论

数据库时区 file

lumen设置的时区 file

linux系统当前时区 file

PHP时区 file

3年前 评论

一般有8小时时差是正常的,因为存的是timesteamp类型,也就是时间戳,显示的时候,在模型中使用:

class Address extends Model
{
    use HasDateTimeFormatter;
    ...
}

显示的时候会根据系统的时区自动转化成当前时区的时间。

3年前 评论

谢谢@Smilephp , 加上了你说的DB_TIMEZONE=+08:00

file

再配合另一篇问答中提到的方法就能完美解决了: 在模型或者公共模型中加上

public function serializeDate(\DateTimeInterface $dateTime){
    return $dateTime->format('Y-m-d H:i:s');
}

file

file

file

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!