Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Umgang mit Zeitzonen in PHP und MySQL

Zeitzonen sind nervig, daran besteht kein Zweifel. Wenn ich dich richtig verstehe, willst du, dass dein PHP mal zu der Ansicht zurückkehrt, die in der richtigen Zone für den Benutzer ist, oder?

Was ich tue, ist innerhalb der 'Masteransicht' oder einer Sort- oder Blade.php-Datei, die garantiert mindestens einmal geladen wird, ich überprüfe, ob die Zeitzone dieses Benutzers in einer Sitzungsvariablen gespeichert ist oder nicht. Ist dies nicht der Fall, sende ich eine AJAX-Anfrage an den Server, um den Namen der Zeitzone zu speichern.

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

Beachten Sie, dass dieser Ansatz das jstz-Paket verwendet, das Sie hier herunterladen können und in Ihren <head> einfügen Abschnitt.

Natürlich müssen Sie die Route für diese Anfrage einrichten, in meinem Fall sieht sie so aus:

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

Wenn Sie nun die gegebenen Datetime-Strings der Datenbank in die richtige Zeitzone konvertieren möchten, können Sie die Zeitzone abrufen, indem Sie $tz = $request->session()->get('timezone') sagen und analysieren Sie dann die Daten mit Carbon\Carbon::parse($date, $tz);

Im Allgemeinen würde ich Ihnen empfehlen, alle Daten im UTC-Format zu speichern, da dies der Standard ist und es zwingend erforderlich ist, dass die Datenbank zeitzonenunabhängig bleibt. Wenn Sie jedoch die Voreinstellung ändern möchten, können Sie die Zeile 'timezone' => 'UTC' bearbeiten in config/app.php . Dadurch wird die Zone überschrieben, auf die Laravel seine Zeitstempel standardmäßig eingestellt hat, sodass Ihr created_at, updated_at geändert wird, um diese neue Zeitzone widerzuspiegeln.