У меня есть сервер в GMT, но я хочу обновить эти поля (* created_at * и * updated_at *), чтобы сохранить временные метки в PST.
Я уже делал некоторые тесты, пытаясь выполнить это, но никто из них не был прав.
Но любое из этих обновлений применяет временное обновление к временным меткам 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
– смещение в часах.