Mysql
 sql >> Base de données >  >> RDS >> Mysql

Gestion des fuseaux horaires en PHP et MySQL

les fuseaux horaires sont ennuyeux, cela ne fait aucun doute. Si je vous comprends bien, vous voulez que votre PHP renvoie les heures à la vue qui sont dans la bonne zone pour l'utilisateur, n'est-ce pas ?

Ce que je fais, c'est dans la "vue principale" ou dans un fichier de tri ou blade.php dont le chargement est garanti au moins une fois, je vérifie si le fuseau horaire de cet utilisateur est stocké ou non dans une variable de session. Si ce n'est pas le cas, j'envoie une requête AJAX au serveur pour stocker le nom du fuseau horaire.

{{-- 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

Notez que cette approche utilise le package jstz, que vous pouvez télécharger ici et inclure dans votre <head> rubrique.

Bien sûr, vous devrez configurer la route pour cette requête, dans mon cas, cela ressemble à ceci :

Route::post('api/v1/settings', function () {
    // Save the user's timezone
    if (Request::has('timezone')) {
        Session::put('timezone', Request::get('timezone'));
    }
});

Désormais, lorsque vous souhaitez convertir les chaînes datetime de la base de données dans le fuseau horaire correct, vous pouvez obtenir le fuseau horaire en disant $tz = $request->session()->get('timezone') puis analysez les dates avec Carbon\Carbon::parse($date, $tz);

En général, je vous recommanderais de conserver toutes les dates au format UTC, car c'est la norme et il est impératif que la base de données reste indépendante du fuseau horaire. Mais si vous voulez changer la valeur par défaut, vous pouvez modifier la ligne 'timezone' => 'UTC' dans config/app.php . Cela écrasera la zone sur laquelle Laravel utilise par défaut ses horodatages, de sorte que votre created_at, updated_at sera modifié pour refléter ce nouveau fuseau horaire.