Как обновить часовой пояс для временных меток (created_at и updated_at), которыми управляет Laravel Eloquent?

У меня есть сервер в GMT, но я хочу обновить эти поля (* created_at * и * updated_at *), чтобы сохранить временные метки в PST.

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

  • Я обновляю config / application.php до 'timezone' => 'America / Los_Angeles'
  • Также на сервере я изменил date.timezone в php.ini на 'America / Los_Angeles'

Но любое из этих обновлений применяет временное обновление к временным меткам Laravel Rloquent. Эти поля created_at и updated_at являются дескрипторами Eloquent.

Я также обновляю часовой пояс сервера Ubuntu, используя sudo dpkg-reconfigure tzdata, но это обновление не работает вообще.

Изменить: мне нужно, чтобы временные метки Laravel Eloquent работали над часовым поясом PST для вставки фьючерсов в БД.

Любая помощь будет полезна. Благодарю.

Я знаю, что этот вопрос немного устарел, но я наткнулся на него, пытаясь придумать одно и то же решение, и хотел поделиться тем, как я решил его решить.

Мой совет заключается не в изменении часового пояса, в котором хранятся сообщения. Храните их в базе данных в формате UTC. Хранение вашего хранилища в постоянной системе отсчета, а затем преобразование его в любой часовой пояс, в котором вы нуждаетесь, отображает его в течение длительного времени.

В качестве примера одной из этих головных болей представьте, что два человека пытаются согласовать время встречи в разных часовых поясах, где наблюдается DST, а один нет, и вам нужно отображать время в местном времени каждого пользователя. Насколько сложно было бы преобразовать ваше хранимое время PDT, чтобы сказать: Америка / Кайман (который не соблюдает DST)? И как вы будете учитывать, когда время хранится в PST и PDT? Откуда вы знаете? (Подсказка: без, наверное, сотни строк дополнительного кода, чтобы ответить на один вопрос, вы не будете ).

Чтобы получить тайм-аут в правильном часовом поясе, просто добавьте функцию мутатора в саму модель:

use Carbon\Carbon; class MyModel extends Eloquent { // {{{ getCreatedAtAttribute() public function getCreatedAtAttribute($value) { return Carbon::createFromTimestamp(strtotime($value)) ->timezone('America/Los_Angeles') ->toDateTimeString() ; } // }}} } 

Теперь, когда вы делаете $myModel->created_at он волшебным образом преобразуется в правильный часовой пояс, но вы по-прежнему сохраняете UTC в своей базе данных, который определенно имеет свои привилегии над другими $myModel->created_at для постоянного хранения.

Хотите, чтобы пользователи установили свои собственные часовые пояса? Измените функцию следующим образом:

 public function getCreatedAtAttribute($value) { $user = Auth::user(); // If no user is logged in, we'll just default to the // application's timezone $timezone = $user ? $user->timezone : Config::get('app.timezone'); return Carbon::createFromTimestamp(strtotime($value)) ->timezone($timezone) // Leave this part off if you want to keep the property as // a Carbon object rather than always just returning a string ->toDateTimeString() ; } 

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

Для получения дополнительной информации о мутаторах / аксессуарах Laravel, проверьте документацию .

это просто, просто измените функцию boot () в AppServiceProvider.php

 public function boot() { //set local timezone date_default_timezone_set('Asia/Shanghai'); } 

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

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

  update `table` set created_at = (SELECT created_at) + INTERVAL 2 HOUR; 

Где table – это имя таблицы базы данных, а 2 – смещение в часах.