PHP и MySQL — это отдельные процессы со своими настройками часового пояса по умолчанию. Вы вряд ли столкнетесь с проблемами часового пояса во время разработки или при развертывании одного веб-приложения на своем сервере. В этой ситуации PHP и MySQL могут использовать настройки времени сервера.
Однако что, если:
- Ваше приложение может быть настроено на часовой пояс пользователя?
- Вы используете два или более приложений с разными требованиями к часовому поясу?
- Ваше приложение установлено на общем сервере, и вы не можете установить часовые пояса по умолчанию?
Многие разработчики решают эту проблему, перенося всю ответственность за дату и время на 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. Вам не нужно удалять их, если вы не.