Mysql
 sql >> база данни >  >> RDS >> Mysql

Справяне с часови зони в PHP и MySQL

часовите зони са досадни, няма съмнение в това. Ако ви разбирам правилно, искате вашият 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 ще бъде променен, за да отразява тази нова часова зона.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да променя поднизовете?

  2. Как да актуализирам версията на MySQL двигателя в ClearDB?

  3. mysql2 gem не успява да се компилира с MySQL 5.6.12 на OS X с Homebrew

  4. Съпоставяне на JDBC ResultSet към обект

  5. OctoberCMS:Как да поддържаме двустранна приятелска връзка?