dima9595
@dima9595
Junior PHP

Расхождение даты в базе и при выводе в Laravel, как решить проблему?

Добрый день.

Суть такова:
Используется Laravel 6.
В бд хранится данные в нормальном формате: "2019-04-10 00:00:00".
В модели у меня происходит преобразование через protected $dates. И выводится всё нормально.
Но при выводе в другой модели у меня получается так, что эта дата выводится в таком формате: "2021-04-12T21:00:00.000000Z". Т.е. на 3 часа меньше.

Как мне исправить данную проблему? Вариант с прибавкой +3 часа не подойдёт. Я когда-то давно видел решение такой проблемы, но не могу найти. Помогите пожалуйста. Заранее спасибо.

PS: преобразовывать дату в другой формат крайне не желательно, так как во многих файлах придётся менять, а это тот ещё геморой...
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@Mellorn
Это у вас при сериализации такое происходит, как я понимаю?
Если да, то необходимо переопредилить метод для модели.
Что-то вроде:
protected function serializeDate(DateTimeInterface $date): string
    {
        return Date::instance($date)->toISOString(true);
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
part_os
@part_os
Сложное в простом
config/app.php
Тут посмотрите часовой пояс, попробуйте поменять на нужный
Ответ написан
@sequelone
Как вариант можно написать свою функцию в Helper. К примеру нужно добавить в файл composer.json в секцию "autoload":

"autoload": {
        ...,
        "files": [
            "app/Helpers/functions.php"
        ]
    },


чтобы получилось:

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/Helpers/functions.php"
        ]
    },


Затем в папке app создать папку Helpers, а в ней файл functions.php. В этот файл теперь можно добавлять любые функции, которые можно будет вызывать где угодно. Вот пример использования:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

    function formattedDate($value) {
        $date = new \DateTime($value);
        $intlFormatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::GREGORIAN, IntlDateFormatter::SHORT);
        $intlFormatter->setPattern('d MMMM YYYY в HH:mm');

        $formattedDate = $intlFormatter->format($date);

        return $formattedDate;
    }


И в Blade шаблоне где нужно вызываем функцию {{ formattedDate($item->created_at) }}

Данная функция будет преобразовывать разные форматы данных на выходе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы