i fusi orari sono fastidiosi, su questo non c'è dubbio. Se ho capito bene, vuoi che il tuo PHP restituisca i tempi alla vista che sono nella zona corretta per l'utente, giusto?
Quello che faccio è all'interno della "vista principale" o di qualche tipo o file blade.php che è garantito per essere caricato almeno una volta, controllo se il fuso orario di questo utente è memorizzato o meno in una variabile di sessione. In caso contrario, mando una richiesta AJAX al server per memorizzare il nome del fuso orario.
{{-- 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
Nota che questo approccio utilizza il pacchetto jstz, che puoi scaricare qui
e includi nel tuo <head>
sezione.
Ovviamente dovrai impostare il percorso per questa richiesta, nel mio caso si presenta così:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Ora, quando vuoi convertire le stringhe datetime del database nel fuso orario corretto, puoi ottenere il fuso orario dicendo $tz = $request->session()->get('timezone')
e poi analizza le date con Carbon\Carbon::parse($date, $tz);
In generale, ti consiglio di rimanere con la memorizzazione di tutte le date in formato UTC, poiché questo è lo standard ed è imperativo che il database rimanga indipendente dal fuso orario. Ma se vuoi cambiare l'impostazione predefinita, puoi modificare la riga 'timezone' => 'UTC'
in config/app.php
. Ciò sovrascriverà la zona in cui Laravel imposta i suoi timestamp, quindi il tuo creato_at, aggiornato_at verrà modificato per riflettere quel nuovo fuso orario.