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

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

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

20.08.2008 17:55:35
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

17
20.08.2008 19:16:56

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

php - дата

mysql - utc-timestamp

11
20.08.2008 19:09:18
+1 Я смотрю бегло, но всегда храню время Unix / Epoch как int со знаком (хочу подписать для математики дат). Никогда не путается и переживает смены правительства TZ.
Jé Queue 7.12.2009 20:55:13
+1, простота и нормализация (= в UTC) на уровне данных затрудняет неверную логику. Любые языковые преобразования должны выполняться только на уровне отображения.
Kos 24.09.2012 08:48:17

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

0
20.08.2008 19:22:07

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?)

3
31.03.2010 03:06:12

В 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
5.02.2017 06:34:55