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

Beskæftiger sig med tidszoner i PHP og MySQL

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.



  1. Hvordan reparerer man en serialiseret streng, der er blevet beskadiget af en forkert bytetællingslængde?

  2. Indsættelse af billede i BLOB Oracle 10g

  3. PG::DuplicateTable:FEJL:Relationsindlæg findes allerede

  4. Nogen der kender til en god PHP ORM, der IKKE bruger PDO?