Работа с сервером PHP и сервером MySQL в разных часовых поясах
Для тех из нас, кто использует стандартные пакеты общедоступного хостинга, такие как GoDaddy или Network Solutions, как вы обрабатываете конверсии datetime, когда ваш сервер хостинга (PHP) и сервер MySQL находятся в разных часовых поясах?
Кроме того, есть ли у кого-нибудь советы по лучшей практике для определения того, в какой часовом поясе посетитель вашего сайта входит и управляет переменной datetime соответствующим образом?
Ответы
Ответ 1
Начиная с PHP 5.1.0 вы можете использовать функцию date_default_timezone_set(), чтобы установить часовой пояс по умолчанию, используемый всеми функциями даты и времени в script.
Для MySql (цитируется Поддержка сервера часовых поясов MySQL)
До 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 самостоятельно установить свои часовые пояса.
Ответ 2
Хранить все как UTC. Вы можете делать конверсии на уровне клиента или на стороне сервера, используя настройки клиента.
php-date
mysql - utc-timestamp
Ответ 3
RE ответ от Желько Живковича, дескрипторы часовых поясов, такие как "Европа/Лондон", работают только в том случае, если администратор 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?)
Ответ 4
Я сохраняю все свои даты как bigint из-за того, что раньше у меня были проблемы с типом dateTime. Я сохраняю результат функции времени() PHP, теперь они считаются находящимися в одном и том же часовом поясе:)
Ответ 5
В 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';