Каков наилучший способ управления датами в PHP, MySQL и т. Д.? - PullRequest
5 голосов
/ 10 января 2009

Мой сервер находится в Далласе. Я в Нью-Йорке ... и в PHP, и в MySQL есть переменные конфигурации для установки часового пояса.

Как мне заставить их всех работать вместе? Какие даты я должен хранить в MySQL? Как мне заставить PHP обрабатывать изменение даты в зависимости от предпочтений пользователя?

Имейте в виду: я не думаю, что PHP когда-либо явно устанавливал дату, он всегда использует "NOW ()" в запросах ... однако я предвижу необходимость сделать это Как это будет сделано?

Я надеюсь, что опыт SO поможет мне здесь.

Ответы [ 4 ]

16 голосов
/ 10 января 2009

Используйте Unix Time везде. Он использует UTC, поэтому он одинаков для всех часовых поясов. Методы для дат обычно конвертируются в него и возвращаются из него, используя информацию о часовом поясе, которую они имеют, поэтому у вас будет правильное время.

В качестве альтернативы вы можете использовать Unix Time только для передачи времени с одного компьютера на другой (например, с БД на ваш сервер с PHP или на клиент JavaScript). Есть функции для преобразования в него и из него на каждом языке. Для MySQL это:

UNIX_TIMESTAMP(date)
FROM_UNIXTIME(unix_timestamp)

Таким образом, вы можете правильно отформатировать свое время в БД и в журналах, но при этом везде иметь правильное местное время.

2 голосов
/ 10 января 2009

Я предпочитаю использовать даты и время в нативной форме относительно среды, то есть метки времени Unix в PHP и поля DATE / TIME / DATETIME / TIMESTAMP в MySQL. Я перевожу оба значения в другое, используя FROM_UNIXTIME() и UNIX_TIMESTAMP(). Я предпочитаю это вместо меток времени Unix, потому что родные даты / время намного легче читать.

0 голосов
/ 10 января 2009

MySQL-сервер хранит даты в формате, независимом от часового пояса (UTC).
Но прежде чем он сохранит дату, он будет конвертирован с использованием своего часового пояса.

U может изменить часовой пояс mysql для каждого соединения * 1:

mysql_query('SET time_zone = "'.$timezone.'"');

Вы также можете изменить часовой пояс для каждого сценария.

date_default_timezone_set($timezone);

Если вы установите для них один и тот же часовой пояс, "2009-01-10 13:30:00" будет означать одинаковое значение как для MySQL, так и для PHP.

Но имейте в виду, что 2 сервера имеют разные значения внутренних часов, так что если вы хотите генерировать временные метки на основе текущего времени. Сделайте это в MySQL или php.

* 1) Поддержка часового пояса MySQL может потребовать дополнительной настройки. проверьте руководство

0 голосов
/ 10 января 2009

Запишите свои даты в GMT (нулевое смещение), а затем рассчитайте смещение на основе местного часового пояса (например, EST +6, поэтому вы добавили бы 6 часов к GMT).

Проверьте Дата документы для функции date_default_timezone_set().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...