Каков наилучший способ обработки часовых поясов в PHP и MySQL?
В настоящее время я изучаю лучший способ обработки часовых поясов на моем сайте. Люди из разных стран будут обращаться к нему одновременно, и я должен показать им временную информацию, поэтому я подумал:
Хранить каждый раз в базе данных в соответствии с моим сервером (тот же часовой пояс, определенный PHP)
Затем пользователь может выбрать свой часовой пояс, и я делаю необходимые преобразования с помощью функции mysql DATEADD.
Кажется, что все работает нормально, но мои вопросы:
- Это лучший способ?
- Является ли DATEADD наиболее эффективной функцией для обработки разницы в часах?
Спасибо.
Ответы
Ответ 1
Как описано в Поддержка часовых поясов сервера MySQL:
Текущая настройка часового пояса влияет на отображение и сохранение значений времени, чувствительных к зоне. Сюда входят значения, отображаемые функциями, такими как NOW()
или CURTIME()
, а также значения, хранящиеся в столбцах TIMESTAMP
и извлеченные из них. Значения для столбцов TIMESTAMP
преобразуются из текущего часового пояса в UTC для хранения и от UTC к текущему часовому поясу для извлечения.
Следовательно, если вы используете столбцы типа TIMESTAMP
, MySQL будет автоматически обрабатывать изменение часового пояса для вас: просто установите соответствующий часовой пояс для сеанса в time_zone
переменная.
Ответ 2
Вы думаете в правильном направлении.
Я бы не использовал часовой пояс сервера. Вместо этого используйте время согласованного универсального времени (UTC). Это стандарт мирового времени. Это почти то же самое, что и среднее время по Гринвичу (GMT). Обратите внимание, что UTC не изменяется с помощью летнего времени.
Для использования в PHP см.: http://php.net/manual/en/function.gmdate.php
Здесь вы можете либо добавить часы через: http://www.php.net/manual/en/datetime.add.php
Или установите часовой пояс на основе предпочтений пользователей: http://www.php.net/manual/en/datetime.settimezone.php
Тот, который вы используете, основан на том, как вы получаете часовой пояс пользователя. Если вы попросите их об этом (точнее), вы можете установить часовой пояс в PHP с пользователем, выбрав из поля со списком. Если вы получите его из заголовка с помощью JavaScript с помощью getTimezoneOffset();
, тогда лучше всего добавить часы на основе смещения часового пояса.
Ответ 3
Я лично все время настраивал в своей БД в соответствии с часовым поясом GMT +0.00. Поэтому я использую UTC_TIMESTAMP()
(или UTC_DATE()
, UTC_TIME()
- в зависимости от того, что применимо), когда я хочу добавить текущее время, например. Это независимый от сервера, поэтому я уверен, что даже если я изменю свой сервер, мне не нужно будет беспокоиться об этой проблеме в будущем.
Затем параметры: если у ваших посетителей есть возможность выбрать свои собственные часовые пояса, вы можете использовать DATE_ADD()
и DATE_SUB()
, чтобы форматировать результат перед предоставлением результатов.
В противном случае, если у вас есть шанс (это мое любимое решение), вы можете использовать Javascript для форматирования этой даты/времени, с которой вы можете легко справиться с чем-то вроде
function getLocalDate(dt) {
var d = new Date(0);
d.setUTCSeconds(dt);
return d.toLocaleDateString();
// or in some format that you choose
}
который получает дату, повторяемую PHP, используя strtotime($row['some_date']);
.