Для тех из нас, кто использует стандартные пакеты общего хостинга, такие как GoDaddy или Network Solutions, как вы обрабатываете преобразование даты и времени, когда ваш хост-сервер (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);
Или вы можете предложить пользователям возможность самостоятельно устанавливать свои часовые пояса.
Храните все как UTC. Вы можете выполнять преобразования на уровне клиента или на стороне сервера, используя настройки клиента.
Я сохраняю все свои даты как bigint из-за проблем с типом dateTime. Я сохраняю результат PHP-функции time () в ней, теперь они считаются находящимися в одном часовом поясе :)
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 к тому моменту, когда ваше приложение увидит набор результатов (что иногда может быть проблемой, если вам действительно нужно знать исходный часовой пояс события, тогда он должен находиться в другом столбце)
и что касается «почему бы просто не хранить все время как целые числа», это лишает вас возможности сравнивать и проверять даты, а также означает, что вам всегда нужно преобразовывать представление даты на уровне приложения (и это трудно на глаза, когда Вы смотрите на данные напрямую - быстро, что случилось в 1254369600?)
В 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';