tidszoner er irriterende, det er der ingen tvivl om. Hvis jeg forstår dig rigtigt, vil du have din PHP til at returnere tider til den visning, der er i den rigtige zone for brugeren, ikke?
Det, jeg gør, er inden for 'master view' eller en slags blade.php-fil, der garanteres at blive indlæst mindst én gang, jeg tjekker, om denne brugers tidszone er gemt i en sessionsvariabel. Hvis det ikke er det, sender jeg en AJAX-anmodning til serveren om at gemme navnet på tidszonen.
{{-- 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
Bemærk, at denne tilgang bruger jstz-pakken, som du kan downloade her
og inkludere i din <head>
afsnit.
Selvfølgelig skal du konfigurere ruten for denne anmodning, for mit tilfælde ser den sådan ud:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Når du nu vil konvertere de givne databasedatotidsstrenge til den korrekte tidszone, kan du få tidszonen ved at sige $tz = $request->session()->get('timezone')
og parse derefter datoerne med Carbon\Carbon::parse($date, $tz);
Generelt vil jeg anbefale dig at blive med at gemme alle datoer i UTC-format, da det er standarden, og det er bydende nødvendigt, at databasen forbliver tidszoneagnostisk. Men hvis du vil ændre standarden, kan du redigere linjen 'timezone' => 'UTC'
i config/app.php
. Det vil overskrive den zone, som Laravel som standard indstiller sine tidsstempler til, så din create_at, updated_at vil blive ændret for at afspejle den nye tidszone.