Каков наилучший способ обработки часовых поясов в 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']);.