この質問は少し古いことは知っていますが、同じ解決策を考え出そうとしたときに偶然見つけたので、どのように解決したかを共有したいと思いました。
私のアドバイスは、メッセージが保存されているタイムゾーンを変更しないことです。メッセージをUTCとしてデータベースに保存します。ストレージを一定の参照フレームに設定し、それを必要なタイムゾーンに変換して表示することで、長期的には頭痛の種を減らすことができます。
これらの頭痛の種の1つの例として、2人が異なるタイムゾーンで会議時間を調整しようとしていると想像してください。1人はDSTを監視し、もう1人は監視せず、各ユーザーの現地時間で時間を表示する必要があります。保存されているPDT時間を、America / Cayman(DSTを監視しない)に変換するのはどれほど難しいでしょうか。また、PSTとPDTで時刻が保存される場合、どのように考慮しますか?どうやって知る? (ヒント:その1つの質問に答えるためだけに、おそらく数百行の余分なコードがなければ、 。
正しいタイムゾーンでタイムアウトを取得するには、モデル自体にミューテーター関数を追加するだけです。
use Carbon\Carbon;
class MyModel extends Eloquent
{
public function getCreatedAtAttribute($value)
{
return Carbon::createFromTimestamp(strtotime($value))
->timezone('America/Los_Angeles')
->toDateTimeString()
;
}
}
これで、$myModel->created_at
を実行するたびに 魔法のように正しいタイムゾーンに変換されますが、データベースにUTCを保持しているため、永続的なストレージとして他のタイムゾーンよりも確実にメリットがあります。
ユーザーが独自のタイムゾーンを設定できるようにしたいですか?関数を次のように変更します:
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ミューテーター/アクセサーの詳細については、ドキュメント をご覧ください。 。