Mysql
 sql >> Database >  >> RDS >> Mysql

Gestione dei fusi orari in PHP e MySQL

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.