sql >> データベース >  >> RDS >> Mysql

Laravel Eloquentが管理するタイムスタンプ(created_atおよびupdated_at)のタイムゾーンを更新するにはどうすればよいですか?

    この質問は少し古いことは知っていますが、同じ解決策を考え出そうとしたときに偶然見つけたので、どのように解決したかを共有したいと思いました。

    私のアドバイスは、メッセージが保存されているタイムゾーンを変更しないことです。メッセージを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ミューテーター/アクセサーの詳細については、ドキュメント をご覧ください。 。



    1. SaaSサブスクリプションデータモデル

    2. テーブル内の各IDの最大連続年数を検索します(Oracle SQL)

    3. WindowsでPostgreSQLを起動するにはどうすればよいですか?

    4. SQL count(*)のパフォーマンス