Неправильный часовой пояс с метками времени красноречивой модели в $ model-> get(), но исправьте с помощью print_r()

#laravel #eloquent #timestamp

#laravel #eloquent #timestamp

Вопрос:

Я испытываю нечто довольно странное для любой модели Eloquent с Laravel 7!

PS: Я запускал каждый тест, который я делал:

 php artisan optimize:clear
  

Я не знаю, чего мне здесь не хватает!

Я не буду публиковать никакой код, потому что это простой CRUD с привязками модели.

При сохранении полей created_at и updated_at они правильно сохраняются в MySQL с моим часовым поясом «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';
}
  

Но никакого эффекта!

Заранее спасибо!

Ответ №1:

Laravel 7 использует новый формат сериализации даты при использовании метода toArray или toJSON в моделях Eloquent с UTC

До 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');
}
  

Смотрите официальный документ по обновлению здесь

Ответ №2:

Если вы изменили конфигурацию часового пояса в config/app.php но, сохраняя дату в базе данных с другими форматами часовых поясов, сохраните часовой пояс в UTC, чтобы laravel не менял его на другие форматы при вызове из класса модели, или вы можете сделать наоборот, сохранив его в формате UTC в базе данных, а затем измените конфигурацию на часовой пояс, который нужен вашему приложению.

 // config/app.php

'timezone' => 'UTC',