Работа с сервером PHP и сервером MySQL в разных часовых поясах

Для тех из нас, кто использует стандартные пакеты общедоступного хостинга, такие как GoDaddy или Network Solutions, как вы обрабатываете конверсии datetime, когда ваш сервер хостинга (PHP) и сервер MySQL находятся в разных часовых поясах?

Кроме того, есть ли у кого-нибудь советы по лучшей практике для определения того, в какой часовом поясе посетитель вашего сайта входит и управляет переменной datetime соответствующим образом?

Начиная с PHP 5.1.0 вы можете использовать функцию date_default_timezone_set (), чтобы установить часовой пояс по умолчанию, используемый всеми функциями даты и времени в скрипте.

Для MySql (цитируется на странице поддержки часовых поясов MySQL Server )

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

Вас интересует настройка соединения в часовом поясе, которую вы будете использовать в начале ваших сценариев

SET timezone = 'Europe/London'; 

Что касается определения настройки часового пояса клиента, вы можете использовать немного JavaScript для получения и сохранения этой информации в файл cookie и использовать его при последующих чтениях страницы, чтобы рассчитать правильный часовой пояс.

 //Returns the offset (time difference) between Greenwich Mean Time (GMT) //and local time of Date object, in minutes. var offset = new Date().getTimezoneOffset(); document.cookie = 'timezoneOffset=' + escape(offset); 

Или вы можете предложить пользователям chioce самостоятельно установить свои часовые пояса.

Храните все как UTC. Вы можете делать конверсии на уровне клиента или на стороне сервера, используя настройки клиента.

php – дата

mysql – utc-timestamp

RE ответ от Željko Živković, дескрипторы часовых поясов, такие как «Европа / Лондон», работают только в том случае, если администратор mySQL добавил в систему таблицы часовых поясов и сохранит их.

В противном случае вы ограничены числовыми смещениями, такими как «-4: 00». К счастью, формат php date ('P') предоставляет его (по 5.1.3)

Итак, скажем, файл конфигурации приложения, который у вас может быть

 define('TZ', 'US/Pacific'); .... if (defined('TZ') && function_exists('date_default_timezone_set')) { date_default_timezone_set(TZ); $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P'))); } 

Это означает, что PHP и mySQL согласятся с тем, какой временной интервал использовать.

Всегда используйте TIMESTAMP для хранения значений времени . Столбец фактически хранится как UNIX_TIME (эпоха), но неявно преобразуется из текущего смещения временной шкалы при записи и обратно при чтении.

Если вы хотите отображать время для пользователей в других часовых поясах, то вместо глобального define () установите указанный часовой пояс в приведенном выше. Значения TIMESTAMP будут автоматически преобразованы mySQL к моменту, когда ваше приложение увидит результирующий набор (что иногда может быть проблемой, если вам нужно действительно узнать исходный часовой пояс события, то он должен быть в другом столбце)

и что «почему бы просто не хранить все время как int», что лишает вас возможности сравнивать и проверять даты, и означает, что вам всегда нужно преобразовать в датированное представление на уровне приложения (и трудно смотреть в глаза, когда вы смотрите на данные напрямую – быстро, что произошло на 1254369600?)

Я сохраняю все свои даты как bigint из-за того, что раньше у меня были проблемы с типом dateTime. Я сохраняю результат функции времени () PHP, теперь они считаются находящимися в одном и том же часовом поясе 🙂

В php задайте часовой пояс в файле php.ini: ini_set("date.timezone", "America/Los_Angeles");

или, в частности, страницу, которую вы можете сделать: date_default_timezone_set("America/Los_Angeles");

В mysql вы можете сделать так: SET GLOBAL time_zone = 'America/Los_Angeles';