$model->get() 上 Eloquent Model 时间戳的时区错误,但使用 print_r() 正确

Gil*_*ino 2 timestamp laravel eloquent

对于使用 Laravel 7 的任何 Eloquent 模型,我都遇到了一些非常奇怪的事情!

PS:我已经运行了我所做的每一个测试:

php artisan optimize:clear
Run Code Online (Sandbox Code Playgroud)

我不知道我在这里错过了什么!

我不会发布任何代码,因为这是一个带有模型绑定的简单 CRUD。

保存 created_at 和 updated_at 字段时,它会正确保存在 MySQL 中,我的时区为“America/Sao_Paulo”。

但是,如果我在任何控制器中执行此操作:

return $model->get()
Run Code Online (Sandbox Code Playgroud)

或者

return $model->paginate()
Run Code Online (Sandbox Code Playgroud)

或者

Model::all()
Run Code Online (Sandbox Code Playgroud)

我得到回应:

{
    "data": [ 
        {
            ... other fields
            "created_at": "2020-08-23T15:22:41.000000Z",
            "updated_at": "2020-08-23T15:22:41.000000Z"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

它以 +1 小时返回错误的时间。

然而,这就是事情变得奇怪的地方......如果我 print_r() 任何一个,我都会得到正确的时间!

Array
        (
            ... other fields 
            [created_at] => 2020-08-23 12:22:41
            [updated_at] => 2020-08-23 12:22:41
        )
Run Code Online (Sandbox Code Playgroud)

我尝试使用:

public function getDateFormat()
{
    return 'Y-m-d H:i:s';
}
Run Code Online (Sandbox Code Playgroud)

但是没有效果!

提前致谢!

sta*_*sta 6

Laravel 7在使用UTC 的Eloquent模型上使用toArray或toJson方法时使用新的日期序列化格式

在Laravel 7之前,日期将被序列化为如下格式:

2019-12-02 20:01:00
Run Code Online (Sandbox Code Playgroud)

使用ISO-8601格式序列化的日期将显示为:

2019-12-02T20:01:00.283041Z
Run Code Online (Sandbox Code Playgroud)

请注意,ISO-8601日期始终以UTC表示。

如果您想继续使用以前的行为,您可以覆盖serializeDate()模型上的方法:

use DateTimeInterface;

protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)

在此处查看官方升级文档