Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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';