zona waktu menyebalkan, tidak ada keraguan tentang itu. Jika saya memahami Anda dengan benar, Anda ingin PHP Anda mengembalikan waktu ke tampilan yang berada di zona yang benar untuk pengguna, bukan?
Apa yang saya lakukan adalah dalam 'master view' atau semacam atau file blade.php yang dijamin dimuat setidaknya sekali, saya memeriksa apakah zona waktu pengguna ini disimpan dalam variabel sesi. Jika tidak, saya mengirim permintaan AJAX ke server untuk menyimpan nama zona waktu.
{{-- 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
Perhatikan bahwa pendekatan ini menggunakan paket jstz, yang dapat Anda unduh di sini
dan sertakan dalam <head>
. Anda bagian.
Tentu saja Anda perlu mengatur rute untuk permintaan ini, untuk kasus saya, tampilannya seperti ini:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Sekarang, ketika Anda ingin mengonversi string datetime database yang diberikan ke zona waktu yang benar, Anda bisa mendapatkan zona waktu dengan mengatakan $tz = $request->session()->get('timezone')
dan kemudian menguraikan tanggal dengan Carbon\Carbon::parse($date, $tz);
Secara umum, saya akan merekomendasikan Anda tetap dengan menyimpan semua tanggal dalam format UTC, karena itu adalah standar dan sangat penting bahwa database tetap agnostik zona waktu. Namun jika ingin mengubah default, Anda dapat mengedit baris 'timezone' => 'UTC'
di config/app.php
. Itu akan menimpa zona yang menjadi default stempel waktunya Laravel, jadi create_at Anda, updated_at akan diubah untuk mencerminkan zona waktu baru itu.