sql >> Databasteknik >  >> RDS >> Mysql

Hanterar tidszoner i PHP och MySQL

tidszoner är irriterande, det råder ingen tvekan om det. Om jag förstår dig rätt vill du att din PHP ska återställa tider till vyn som är i rätt zon för användaren, eller hur?

Vad jag gör är inom 'master view' eller någon sorts eller blade.php-fil som garanterat laddas minst en gång, jag kontrollerar om denna användares tidszon är lagrad i en sessionsvariabel. Om det inte är det skickar jag en AJAX-förfrågan till servern för att lagra namnet 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

Observera att detta tillvägagångssätt använder sig av jstz-paketet, som du kan ladda ner här och inkludera i din <head> avsnitt.

Naturligtvis måste du ställa in rutten för denna begäran, för mitt fall ser det ut så här:

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

Nu, när du vill konvertera de givna datetime-databassträngarna till rätt tidszon, kan du få tidszonen genom att säga $tz = $request->session()->get('timezone') och analysera sedan datumen med Carbon\Carbon::parse($date, $tz);

I allmänhet skulle jag rekommendera att du stannar kvar med att lagra alla datum i UTC-format, eftersom det är standarden och det är absolut nödvändigt att databasen förblir tidszonagnostisk. Men om du vill ändra standarden kan du redigera raden 'timezone' => 'UTC' i config/app.php . Det kommer att skriva över zonen som Laravel anger sina tidsstämplar som standard, så din create_at, updated_at kommer att ändras för att återspegla den nya tidszonen.



  1. Så här åtgärdar du MySQL JDBC 08001-databasanslutningsfel

  2. Hur förbättrar man denna MySQL-fråga med join?

  3. Uppdatera kolumn i databasen där maxvärde php mysql

  4. php foreach loop och addmore-knappen i ett formulär