sql >> Database >  >> RDS >> Mysql

Omgaan met tijdzones in PHP en MySQL

tijdzones zijn vervelend, daar bestaat geen twijfel over. Als ik je goed begrijp, wil je dat je PHP tijden terugstuurt naar de weergave die zich in de juiste zone voor de gebruiker bevindt, toch?

Wat ik doe is binnen de 'master view' of een soort of blade.php-bestand dat gegarandeerd minstens één keer wordt geladen, ik controleer of de tijdzone van deze gebruiker al dan niet is opgeslagen in een sessievariabele. Als dat niet het geval is, stuur ik een AJAX-verzoek naar de server om de naam van de tijdzone op te slaan.

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

Merk op dat deze aanpak gebruikmaakt van het jstz-pakket, dat u hier kunt downloaden en opnemen in uw <head> sectie.

Natuurlijk moet je de route voor dit verzoek instellen, voor mijn geval ziet het er als volgt uit:

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

Als u nu de gegeven database datetime-strings naar de juiste tijdzone wilt converteren, kunt u de tijdzone verkrijgen door $tz = $request->session()->get('timezone') te zeggen en ontleden vervolgens de datums met Carbon\Carbon::parse($date, $tz);

Over het algemeen zou ik u aanraden om alle datums in UTC-formaat op te slaan, aangezien dat de standaard is en het absoluut noodzakelijk is dat de database tijdzone-onafhankelijk blijft. Maar als u de standaard wilt wijzigen, kunt u de regel bewerken 'timezone' => 'UTC' in config/app.php . Dat zal de zone overschrijven waar Laravel zijn tijdstempels standaard op zet, dus uw created_at, updated_at zal worden gewijzigd om die nieuwe tijdzone weer te geven.



  1. Wilt u rijnummer op kolomgroep in MIJN SQL?

  2. Tabel maken met identiteitskolom

  3. Hoe installeer ik Oracle Instant Client op een Mac?

  4. Groottelimiet van JSON-gegevenstype in PostgreSQL