Некоторые проблемы с часовыми поясами в PHP уже давно находятся в моем сознании, и мне было интересно, есть ли у них лучшие способы справиться с этим, чем то, что я сейчас делаю.
Все проблемы связаны с изменением даты хранения базы данных:
При работе с сайтом, который должен поддерживать несколько часовых поясов (для пользователей), чтобы нормализовать тайм-аут временной шкалы хранимых временных меток, я всегда храню его в часовом поясе сервера с помощью атрибута CURRENT_TIMESTAMP
или функции NOW()
.
Таким образом, мне не нужно учитывать, какой временной интервал был задан для PHP, когда была введена метка времени (так как функции времени PHP имеют информацию о часовом поясе). Для каждого пользователя, в соответствии с его предпочтениями, я устанавливаю часовой пояс где-то в моем загрузочном файле, используя:
date_default_timezone_set($timezone);
Когда я ищу формат даты с помощью функции php date()
, некоторая форма преобразования должна произойти, поскольку MySQL в настоящее время хранит временную метку в формате Y-m-d H:i:s
. Не обращая внимания на часовой пояс, вы можете просто запустить:
$date = date($format,strtotime($dbTimestamp));
Проблема заключается в том, что date()
и strtotime()
являются одновременно функциями, зависящими от времени, что означает, что если часовой пояс PHP задан иначе, чем часовой пояс сервера, смещение временной зоны будет применяться дважды (вместо того,).
Чтобы справиться с этим, я обычно извлекаю временные метки MySQL, используя функцию UNIX_TIMESTAMP()
, которая не имеет информации о часовом поясе, что позволяет мне применять date()
непосредственно к ней, тем самым применяя только временное смещение.
Мне не нравится этот "взломать", поскольку я больше не могу извлекать эти столбцы, как обычно, или использовать *
для извлечения всех столбцов (иногда это упрощает запросы). Кроме того, иногда это просто не вариант использования UNIX_TIMESTAMP()
(особенно при использовании с пакетами с открытым исходным кодом без значительной абстракции для композиции запроса).
Другая проблема заключается в сохранении метки времени, когда использование CURRENT_TIMESTAMP
или NOW()
не является опцией - сохранение созданной PHP метки времени сохранит ее со смещением часового пояса, которое я бы хотел избежать.
Мне, вероятно, не хватает чего-то действительно элементарного здесь, но до сих пор мне не удалось найти общее решение для решения этих проблем, поэтому я вынужден рассматривать их в каждом конкретном случае. Ваши мысли очень приветствуются