【问题标题】:Wrong timezone with Eloquent Model timestamps on $model->get(), but correct with print_r()$model->get() 上 Eloquent 模型时间戳的时区错误,但 print_r() 正确
【发布时间】:2020-12-12 09:13:35
【问题描述】:

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

P.S.:我已经完成了我所做的每一个测试:

php artisan optimize:clear

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

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

当保存 created_at 和 updated_at 字段时,它正确地保存在 MySQL 中,我的 timezome “America/Sao_Paulo”。

但如果我在任何控制器中这样做:

return $model->get()

return $model->paginate()

Model::all()

我得到了回应:

{
    "data": [ 
        {
            ... other fields
            "created_at": "2020-08-23T15:22:41.000000Z",
            "updated_at": "2020-08-23T15:22:41.000000Z"
        }
    ]
}

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

然而,事情变得奇怪了……如果我 print_r() 其中任何一个,我都会得到正确的时间!

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

我尝试使用:

public function getDateFormat()
{
    return 'Y-m-d H:i:s';
}

但是没有效果!

提前致谢!

【问题讨论】:

    标签: laravel eloquent timestamp


    【解决方案1】:

    如果您更改了 config/app.php 中的时区配置,但使用其他时区格式将日期保存在数据库中,则将时区保持为 UTC,以便 laravel 在从模型类调用时不会将其更改为其他格式,或者您可以通过将其以 UTC 格式保存在数据库中来执行相反的操作,然后将配置更改为您的应用所需的时区。

    // config/app.php
    
    'timezone' => 'UTC',
    

    【讨论】:

      【解决方案2】:

      Laravel 7 在使用 UTC 的 Eloquent 模型上使用 toArraytoJson 方法时使用新的日期序列化格式强>

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

      2019-12-02 20:01:00
      

      使用 ISO-8601 格式序列化的日期将如下所示:

      2019-12-02T20:01:00.283041Z
      

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

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

      use DateTimeInterface;
      
      protected function serializeDate(DateTimeInterface $date)
      {
          return $date->format('Y-m-d H:i:s');
      }
      

      查看官方升级文档here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-07
        • 2015-08-30
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2011-05-01
        相关资源
        最近更新 更多