tidszoner är irriterande, det råder ingen tvekan om det. Om jag förstår dig rätt vill du att din PHP ska återställa tider till vyn som är i rätt zon för användaren, eller hur?
Vad jag gör är inom 'master view' eller någon sorts eller blade.php-fil som garanterat laddas minst en gång, jag kontrollerar om denna användares tidszon är lagrad i en sessionsvariabel. Om det inte är det skickar jag en AJAX-förfrågan till servern för att lagra namnet på tidszonen.
{{-- 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
Observera att detta tillvägagångssätt använder sig av jstz-paketet, som du kan ladda ner här
och inkludera i din <head>
avsnitt.
Naturligtvis måste du ställa in rutten för denna begäran, för mitt fall ser det ut så här:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Nu, när du vill konvertera de givna datetime-databassträngarna till rätt tidszon, kan du få tidszonen genom att säga $tz = $request->session()->get('timezone')
och analysera sedan datumen med Carbon\Carbon::parse($date, $tz);
I allmänhet skulle jag rekommendera att du stannar kvar med att lagra alla datum i UTC-format, eftersom det är standarden och det är absolut nödvändigt att databasen förblir tidszonagnostisk. Men om du vill ändra standarden kan du redigera raden 'timezone' => 'UTC'
i config/app.php
. Det kommer att skriva över zonen som Laravel anger sina tidsstämplar som standard, så din create_at, updated_at kommer att ändras för att återspegla den nya tidszonen.