###前提・実現したいこと
OSのシステム時刻のタイムゾーンはCET(UTC+1)、DBはシステム時刻と同じものを使用する設定です。この状態でViewなどにCarbonの時刻表示を行えば、CET時刻が表示されて、日本時刻にはなりません。
DBからLaravelのModelを取得したものをdd等のデバッグ表示で確認したところ、created_atやupdated_atはCarbonクラスに変換され、タイムゾーンはCETが設定されていました。これをそのままViewに渡したり、responseとしてブラウザに返すと、CETの時刻が表示されてしまいます。
しかし、日本で使っているときはJSTで表示したいので、以下のように、Model読み込み後に該当のプロパティに対してCarbon#timezoneを使ってJST時刻へ変換します。
PHP
1$model->created_at->timezone("JST");
一応これでもJST表記になってくれるのですが、とにかくめんどくさいのです。画面に表示する時刻項目ごとにこんなことをしていては相当な数の行になります。いちいち人力で変換していては抜けの発生にも繋がります。
システムのタイムゾーンをJSTに変えることでこんなことを考えなくても済むのですが、今制作しているアプリは「海外からの利用」も想定しているため、特定のタイムゾーンで固定することは望ましくなく、ユーザ単位で表示されるタイムゾーンを切り替えることを実装する必要があります。
どうにかしてModelからCarbonプロパティへアクセスするときに、一括で指定したタイムゾーンへ変換する方法はないでしょうか?また、こういった「Laravelでユーザごとに使用するタイムゾーンを切り分けられる手法」があれば教えていただけないでしょうか。
考えている方法としては以下のような物があります。
- Providerを使って、ログインユーザの設定したタイムゾーンに切り替える(しかしDBから受け取った値自体が書き変わらないのでうまくいかない)
- アプリで使用するModel用の中間クラスModelBaseを作り、そのModelBase内でなんとか変換する(
__constructor
をいじってみたが、__constructor
内ではまだプロパティが空なのでなにもできない)
状況
Sampleというモデルで、created_atが2018-01-01 12:00:00
なデータがDBに保存されているとします。
PHP
1$sample = Sample::where('id', '=', 1)->first(); 2dd($sample->created_at, $sample->created_at->copy()->timezone("JST"));
この時ddで表示されるデータは以下のようになっています。
Carbon {#487 ▼ +"date": "2018-01-01 12:00:00.000000" +"timezone_type": 3 +"timezone": "UTC" } Carbon {#521 ▼ +"date": "2018-01-01 21:00:00.000000" +"timezone_type": 2 +"timezone": "JST" }
これを、使用箇所ごとにtimezone設定するのではなく、ビューに渡される、またはレスポンスで返されるときにすべてのCarbonのタイムゾーンが一括で指定できるようになりたいのです。
###発生している問題・エラーメッセージ
とくになし。
###試したこと
- Modelの読み込み前に
date_default_timezone_set
をしてみたところ、Carbonのtimezoneプロパティだけは変わったが、時刻自体は書き換わらなかったので意味がなかった。 - Modelの読み込み後に
date_default_timezone_set
をしてみたところ、なにも変化はなかった。
###補足情報(言語/FW/ツール等のバージョンなど)
Laravel 5.4
CentOS 7.1.1503
MariaDB 10.1.25-MariaDB
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/09 08:42 編集
2018/01/09 08:50