múi giờ gây khó chịu, không có nghi ngờ gì về điều đó. Nếu tôi hiểu đúng về bạn, bạn muốn PHP của bạn trả lại thời gian cho chế độ xem nằm trong vùng chính xác cho người dùng, phải không?
Những gì tôi làm là trong 'chế độ xem chính' hoặc một số tệp sắp xếp hoặc tệp blade.php được đảm bảo tải ít nhất một lần, tôi kiểm tra xem múi giờ của người dùng này có được lưu trữ trong một biến phiên hay không. Nếu không, tôi gửi yêu cầu AJAX đến máy chủ để lưu trữ tên của múi giờ.
{{-- 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
Lưu ý rằng phương pháp này sử dụng gói jstz mà bạn có thể tải xuống tại đây
và đưa vào <head>
của bạn phần.
Tất nhiên, bạn sẽ cần thiết lập tuyến đường cho yêu cầu này, đối với trường hợp của tôi, nó giống như sau:
Route::post('api/v1/settings', function () {
// Save the user's timezone
if (Request::has('timezone')) {
Session::put('timezone', Request::get('timezone'));
}
});
Bây giờ, khi bạn muốn chuyển đổi các chuỗi ngày giờ trong cơ sở dữ liệu đã cho thành múi giờ chính xác, bạn có thể lấy múi giờ bằng cách nói $tz = $request->session()->get('timezone')
và sau đó phân tích cú pháp các ngày bằng Carbon\Carbon::parse($date, $tz);
Nói chung, tôi khuyên bạn nên lưu trữ tất cả các ngày ở định dạng UTC, vì đó là tiêu chuẩn và điều cấp bách là cơ sở dữ liệu vẫn là bất khả tri về múi giờ. Nhưng nếu bạn muốn thay đổi mặc định, bạn có thể chỉnh sửa dòng 'timezone' => 'UTC'
trong config/app.php
. Điều đó sẽ ghi đè lên vùng mà Laravel đặt mặc định dấu thời gian của nó, vì vậy, create_at, updated_at của bạn sẽ được thay đổi để phản ánh múi giờ mới đó.