sql >> Databáze >  >> RDS >> Mysql

Práce s časovými pásmy v PHP a MySQL

časová pásma jsou otravná, o tom není pochyb. Pokud vám dobře rozumím, chcete, aby vaše PHP vrátilo časy do zobrazení, které jsou ve správné zóně pro uživatele, že?

Co dělám, je v rámci „hlavního pohledu“ nebo nějakého sortu nebo souboru blade.php, který se zaručeně načte alespoň jednou, zkontroluji, zda je časové pásmo tohoto uživatele uloženo v proměnné session. Pokud tomu tak není, pošlu na server požadavek AJAX na uložení názvu časového pásma.

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

Upozorňujeme, že tento přístup využívá balíček jstz, který si můžete stáhnout zde a zahrnout do <head> sekce.

Samozřejmě budete muset nastavit cestu pro tento požadavek, v mém případě to vypadá takto:

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

Nyní, když chcete převést danou databázi datatime řetězce na správné časové pásmo, můžete časové pásmo získat tak, že řeknete $tz = $request->session()->get('timezone') a poté data analyzujte pomocí Carbon\Carbon::parse($date, $tz);

Obecně bych vám doporučil, abyste zůstali u ukládání všech dat ve formátu UTC, protože to je standard a je nezbytně nutné, aby databáze zůstala agnostická pro časové pásmo. Ale pokud chcete změnit výchozí nastavení, můžete upravit řádek 'timezone' => 'UTC' v config/app.php . Tím se přepíše zóna, pro kterou Laravel výchozí časová razítka, takže vaše created_at, updated_at budou změněny tak, aby odrážely toto nové časové pásmo.



  1. Nakonfigurujte odesílání protokolu SQL Server

  2. MySQL, jak získat součet počátečních/koncových dat s možnými překrývajícími se daty

  3. Jaký je rozdíl mezi datovými typy sloupců MySQL BOOL a BOOLEAN?

  4. Co je T-SQL?