模型返回的时间和数据库中相差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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

DB_TIMEZONE=+08:00

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

数据库时区 file

lumen设置的时区 file

linux系统当前时区 file

PHP时区 file

2年前 评论

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

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

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

2年前 评论

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

file

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

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

file

file

file

2年前 评论

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