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.