Получить запись из базы данных с правильным временем, используя axios - PullRequest
3 голосов
/ 22 апреля 2020

У меня проблемы с отображением правильного времени. С настройкой UT C по умолчанию в config/app.php у меня разница в 4 часа. Когда я устанавливаю местный часовой пояс, у меня разница в 2 часа. Я предполагаю, что проблема возникает из-за того, что в моей базе данных установлен часовой пояс CEST.

mysql> SELECT  @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| CEST               |
+--------------------+
1 row in set (0.00 sec)

Страница, над которой я работаю, будет использоваться локально, поэтому я бы хотел, чтобы в базе данных было то же время, что и для базы данных. отображается на странице. Время корректно сохраняется в базе данных, изменяется только отображаемое время.

DB -> Laravel

2020-04-21 16:55:08 -> 2020-04-21T14:55:08.000000Z

Интересно, является ли ручная модификация хорошим подходом. В этом случае я не могу изменить часовой пояс в базе данных на сервере. Есть ли какое-либо решение или обходной путь?

ОБНОВЛЕНИЕ # 1

Это решение работает правильно, если я выбираю время для блейд-файла.

public function getCreatedAtAttribute($value) {
    return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $value, 'Europe/Warsaw');
}

Когда я получаю запись использование ax ios createFromFormat не принимает значение $ без обработки. К сожалению, это решение не отображает правильное время.

public function getCreatedAtAttribute($value) {
    $data = \Carbon\Carbon::parse($value);
    return $data::createFromFormat('Y-m-d H:i:s', $data, 'Europe/Warsaw');
}

ОБНОВЛЕНИЕ # 2

Я заметил, что после установки местного часового пояса в config/app.php время отображается правильно в blade.php файлы файлы без каких-либо аксессоров. К сожалению, когда я загружаю записи, используя ax ios Laravel, возвращается неправильное время, несмотря на то, что оно правильно сохраняется в базе данных. Следующий метод доступа работает нормально.

Метод метода доступа:

public function getCreatedAtAttribute($value) {
    $data = \Carbon\Carbon::parse($value);
    return $data->timezone('Europe/Warsaw');
}

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

Ответы [ 4 ]

2 голосов
/ 30 апреля 2020

Самый простой и прямой способ сделать это - обновить каждую модель для использования Cast таким образом, установив для атрибута $timestamps значение false

//Ninja Model

public $timestamps = false;

Это означает, что Laravel будет not автоматически приводит атрибуты created_at и updated_at к экземпляру Carbon, и вы можете извлекать ваши значения, когда вы получаете их из базы данных.

Если не нужно, установите это значение общесистемный часовой пояс для времени Carbon / Date вообще, т.е. не учитывая то, что установлено laravel в app.timezone пути конфигурации. Тогда вам может понадобиться использовать: date_default_timezone_set('Europe/Warsaw') в методе boot() вашего AppServiceProvider класса.

Обычно, любого значения, которое вы задаете в качестве значения timezone в файле конфигурации app, должно быть достаточно для обеспечения часового пояса всего приложения.

2 голосов
/ 22 апреля 2020

Вы можете установить часовой пояс для отображения с помощью Углеродный в laravel:

Carbon::createFromFormat($format, $time, $tz);

Вы можете установить часовой пояс своей базы данных на функцию над углеродом и отобразить ее.

Carbon::createFromFormat('Y-m-d H', '1975-05-21 22', 'CEST');

Таким образом, вы можете отображать правильное время в соответствии с вашей Timzone.

0 голосов
/ 30 апреля 2020

Вы можете настроить часовой пояс в config / app. php, добавив следующий код

date_default_timezone_set("Europe/Warsaw");

, и вы можете добавить столбец в Ваша таблица для хранения времени - добавьте столбец add_time и сохраните значение time() в столбце при вводе данных.

Вы можете добавить столбец, в котором хранится время ввода, используя следующий код

alter table your_table name add_column add_date varchar(10) after another_col_name

данные будут выглядеть как

$mysql_returned = array(

    'data1' => 'somevalue1'
    'data2' => 'somevalue2',
    'data3' => 'somevalue3',
    'data4' => 'somevalue4',
    'add_date' => '1588242603'

);

$time_var = $mysql_returned['add_date'];

, затем вы можете преобразовать обратно в дату и время, используя следующие

$your_real_time = date('d-m-Y h:i:s', $time_var);

0 голосов
/ 22 апреля 2020

Вы можете установить часовой пояс в вашем config/app.php на нужный вам часовой пояс - и использовать DATETIME вместо TIMESTAMP в ваших миграциях, чтобы предотвратить MYSQL automati c преобразование в часовой пояс CEST

...