Статьи

Как синхронизировать ваши часовые пояса PHP и MySQL

PHP и MySQL — это отдельные процессы со своими настройками часового пояса по умолчанию. Вы вряд ли столкнетесь с проблемами часового пояса во время разработки или при развертывании одного веб-приложения на своем сервере. В этой ситуации PHP и MySQL могут использовать настройки времени сервера.

Однако что, если:

  1. Ваше приложение может быть настроено на часовой пояс пользователя?
  2. Вы используете два или более приложений с разными требованиями к часовому поясу?
  3. Ваше приложение установлено на общем сервере, и вы не можете установить часовые пояса по умолчанию?

Многие разработчики решают эту проблему, перенося всю ответственность за дату и время на PHP. Они также могут конвертировать даты в целые числа времени Unix для более простой обработки, хотя вам следует опасаться ошибки Y2K38 .

Хотя это может быть надежным решением, есть несколько недостатков:

  • Вы создаете дополнительную работу для себя.
  • Ваша заявка требует дополнительной обработки для перевода дат.
  • Непросто напрямую изучить даты в таблице.
  • Некоторые основанные на дате SQL-запросы становятся сложными — если не невозможными, например, возвращают все записи, сохраненные в понедельник.
  • Вы не можете использовать функции даты / времени MySQL, такие как NOW () .

К счастью, вы можете синхронизировать часовые пояса PHP и MySQL перед обновлением или запросом базы данных. Вашему приложению потребуется одна переменная конфигурации, которая определяет часовой пояс PHP , например


<?php
define('TIMEZONE', 'America/New_York');

Мы будем использовать это, чтобы установить часовой пояс PHP по умолчанию:

 
date_default_timezone_set(TIMEZONE);

Как насчет MySQL? Можно установить часовой пояс по умолчанию в начале каждого сеанса — я рекомендую делать это после подключения к базе данных. Команда:

 
SET time_zone='offset';

где смещение — это строковое значение, представляющее разницу с UTC / GMT, например, «-4: 00», «+3: 00», «+10: 30» и т. д. Обратите внимание, что знак +/- необходим даже для ноль — и смещения часового пояса не обязательно целый час.

Итак, давайте напишем немного PHP для анализа смещения часового пояса и форматирования строки, понятной MySQL. Сначала мы создадим новый объект DateTime, найдем смещение в секундах и преобразуем его в минуты:

 
$now = new DateTime();
$mins = $now->getOffset() / 60;

Теперь мы можем рассчитать целые часы и минуты. Первая строка определяет, является ли смещение положительным или отрицательным, затем преобразует значение в положительное число, чтобы облегчить вычисление:

 
$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;

Затем функцию PHP sprintf можно использовать для форматирования строки:

 
$offset = sprintf('%+d:%02d', $hrs*$sgn, $mins);

Наконец, мы выполняем команду SET time_zone Следующие строки предоставляют пример, но вы должны использовать свою собственную библиотеку базы данных, где это возможно:

 
$db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword');
$db->exec("SET time_zone='$offset';");

Часовые пояса PHP и MySQL теперь синхронизируются в вашем приложении.

совет: что с обратной косой чертой?

Возможно, вы заметили начальную обратную косую черту при создании экземпляров базового класса DateTime и PDO. Это может быть необходимо, если вы используете пространства имен в своем приложении PHP. Вам не нужно удалять их, если вы не.