strefy czasowe są denerwujące, nie ma co do tego wątpliwości. Jeśli dobrze rozumiem, chcesz, aby PHP zwracało czasy do widoku, które są w odpowiedniej strefie dla użytkownika, prawda?
To, co robię, znajduje się w „widoku głównym” lub jakimś pliku sort lub blade.php, który gwarantuje załadowanie co najmniej raz, sprawdzam, czy strefa czasowa tego użytkownika jest przechowywana w zmiennej sesji. Jeśli tak nie jest, wysyłam żądanie AJAX do serwera, aby zapisać nazwę strefy czasowej.
{{-- 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
Zauważ, że to podejście wykorzystuje pakiet jstz, który możesz pobrać tutaj
i uwzględnij w swoim <head>
sekcja.
Oczywiście będziesz musiał ustawić trasę dla tego żądania, w moim przypadku wygląda to tak:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Teraz, gdy chcesz przekonwertować podane ciągi daty i godziny w bazie danych na prawidłową strefę czasową, możesz uzyskać strefę czasową, mówiąc $tz = $request->session()->get('timezone')
a następnie przeanalizuj daty za pomocą Carbon\Carbon::parse($date, $tz);
Ogólnie zalecałbym przechowywanie wszystkich dat w formacie UTC, ponieważ jest to standard i konieczne jest, aby baza danych pozostała niezależna od strefy czasowej. Ale jeśli chcesz zmienić wartość domyślną, możesz edytować wiersz 'timezone' => 'UTC'
w config/app.php
. Spowoduje to nadpisanie strefy, w której Laravel domyślnie ustawia swoje znaczniki czasowe, więc Twoje created_at, updated_at zostaną zmienione tak, aby odzwierciedlały tę nową strefę czasową.