часовите зони са досадни, няма съмнение в това. Ако ви разбирам правилно, искате вашият PHP да връща времена в изгледа, които са в правилната зона за потребителя, нали?
Това, което правя, е в рамките на 'главния изглед' или някакъв вид или blade.php файл, който гарантирано ще бъде зареден поне веднъж, проверявам дали часовата зона на този потребител се съхранява в променлива на сесията или не. Ако не е, изпращам AJAX заявка до сървъра за съхраняване на името на часовата зона.
{{-- 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
Имайте предвид, че този подход използва пакета jstz, който можете да изтеглите тук
и включете във вашия <head>
раздел.
Разбира се, ще трябва да настроите маршрута за тази заявка, за моя случай тя изглежда така:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Сега, когато искате да конвертирате дадените низове за дата и час в правилната часова зона, можете да получите часовата зона, като кажете $tz = $request->session()->get('timezone')
и след това анализирайте датите с Carbon\Carbon::parse($date, $tz);
Като цяло бих ви препоръчал да запазите всички дати във формат UTC, тъй като това е стандартът и е задължително базата данни да остане независима от часовата зона. Но ако искате да промените по подразбиране, можете да редактирате реда 'timezone' => 'UTC'
в config/app.php
. Това ще презапише зоната, за която Laravel по подразбиране задава своите времеви марки, така че вашият created_at, updated_at ще бъде променен, за да отразява тази нова часова зона.