Работа с PHP-сервером и MySQL-сервером в разных часовых поясах - PullRequest
11 голосов
/ 20 августа 2008

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

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

Ответы [ 5 ]

17 голосов
/ 20 августа 2008

Начиная с 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);

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

11 голосов
/ 20 августа 2008

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

php - дата

mysql - utc-timestamp

3 голосов
/ 31 марта 2010

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 (эпоха), но неявно преобразуется из текущего смещения часового пояса при записи и обратно при чтении.

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

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

0 голосов
/ 05 февраля 2017

В 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';

0 голосов
/ 20 августа 2008

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

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