č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.