как часовой пояс времени работает в базе данных и / или Laravel - PullRequest
0 голосов
/ 30 октября 2019

У меня есть вопрос относительно часового пояса для временных меток.

Как используется часовой пояс в app.php? Я понял, что поведение отличается, если я создаю метку времени с использованием Carbon или запрашиваю значение (метку времени) из БД.

Примечание: MySQL использует часовой пояс системы, который GMT + 8 или Asia / Kuala_Lumpur.

  1. Пример # 1
    • Установить часовой пояс = "UTC" в app.php
    • Создать экземпляр углерода
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404830 {#3496
     date: 2019-10-30 03:07:10.625282 UTC (+00:00),
   }
>>>
Пример # 2
  • Установить часовой пояс = "Asia / Kuala_Lumpur" в app.php
  • Создать экземпляр Carbon
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404816 {#3520
     date: 2019-10-30 11:06:56.316851 Asia/Kuala_Lumpur (+08:00),
   }

Например, № 1 и № 2, это для меня, ожидается. Вы получили другое значение в зависимости от часового пояса. Вещи стали немного страннее (по крайней мере для меня), когда мы запрашиваем метку времени из БД.

Пример # 3
  • Установить часовой пояс = "UTC" в app.php
  • Запрос из БД
>>> RefCyberCity::whereDataSource('ccms')->take(1)->first()->updated_at
=> Illuminate\Support\Carbon @1572083605 {#3531
     date: 2019-10-26 09:53:25.0 UTC (+00:00),
   }
Пример # 4
  • Установить часовой пояс = "Asia / Kuala_Lumpur" в app.php
  • Запрос из БД
>>> RefCyberCity::whereDataSource('ccms')->take(1)->first()->updated_at
[!] Aliasing 'RefCyberCity' to 'App\RefCyberCity' for this Tinker session.
=> Illuminate\Support\Carbon @1572054805 {#3491
     date: 2019-10-26 09:53:25.0 Asia/Kuala_Lumpur (+08:00),
   }

Мы можем видеть, что оба выводят 2019-10-26 09: 53: 25.0, но часовой пояс отличается.

1 Ответ

1 голос
/ 30 октября 2019

Даты, поступающие из базы данных, , фактически строка, и хотя MySQL имеет собственную информацию о часовом поясе, она не отражается в строке даты без часового пояса.

LaravelДрайверы БД предполагают, что он был записан как часовой пояс, установленный в конфигурации приложения. Если бы вы изменили свой часовой пояс в середине проекта, это привело бы к потере всех ваших дат.

Мой личный совет по часовым поясам - сохранять все как UTC в вашем приложении и серверах, а затем изменять только часовой пояс в последний раз. возможный момент (например, в виде), основанный на предпочтениях пользователя. Это также позволяет вам выводить метку времени UTC и обновлять ее в соответствии с локалью пользователя. Часовые пояса очень жесткие, и если в вашей стране летнее время, часовые пояса становятся еще более запутанными, поскольку, например, Europe/London меняет часовой пояс в зависимости от года.

...