タイムゾーンは煩わしいです、それについては間違いありません。私があなたを正しく理解しているなら、あなたはあなたのPHPがユーザーにとって正しいゾーンにあるビューに時間を返すことを望みますよね?
私がしていることは、「マスタービュー」、または少なくとも1回はロードされることが保証されているsortまたはblade.phpファイル内で、このユーザーのタイムゾーンがセッション変数に格納されているかどうかを確認します。そうでない場合は、タイムゾーンの名前を保存するためにサーバーにAJAXリクエストを送信します。
{{-- store timezone in session variables --}}
@if (!Session::has('timezone'))
<script>
$(function () {
var tz = jstz.determine();
var data = {};
if (typeof (tz) !== 'undefined') {
data.timezone = tz.name();
}
if (!$.isEmptyObject(data)) {
$.ajax({
type: "POST",
url: "{{ url('/api/v1/settings') }}",
beforeSend: function (request) {
request.setRequestHeader("X-CSRF-TOKEN", "{{ csrf_token() }}");
},
data: $.param(data),
});
}
});
</script>
@endif
このアプローチではjstzパッケージを利用していることに注意してください。このパッケージは、ここからダウンロード
できます。 <head>
に含めます セクション。
もちろん、このリクエストのルートを設定する必要があります。私の場合、次のようになります。
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
これで、指定されたデータベースの日時文字列を正しいタイムゾーンに変換する場合、$tz = $request->session()->get('timezone')
と言うことでタイムゾーンを取得できます。 次に、Carbon\Carbon::parse($date, $tz);
を使用して日付を解析します。
一般に、すべての日付をUTC形式で保存することをお勧めします。これは標準であり、データベースがタイムゾーンに依存しないことが不可欠であるためです。ただし、デフォルトを変更する場合は、'timezone' => 'UTC'
の行を編集できます。 config/app.php
内 。これにより、Laravelがデフォルトでタイムスタンプを設定するゾーンが上書きされるため、created_at、updated_atは、その新しいタイムゾーンを反映するように変更されます。