Мой сервер находится в Далласе. Я нахожусь в Нью-Йорке ... и у PHP и MySQL есть переменные конфигурации для установки часового пояса.
Как мне заставить их всех работать вместе? Какие даты я должен хранить в MySQL? Как заставить PHP обрабатывать изменение даты в зависимости от предпочтений пользователя?
Имейте в виду: я не думаю, что PHP когда-либо явно устанавливал дату, он всегда использует "NOW ()" в запросах ... однако я предвижу необходимость в этом. Как это сделать?
Я надеюсь, что опыт SO поможет мне в этом.






Запишите свои даты в GMT (нулевое смещение), а затем вычислите смещение на основе местного часового пояса (например, EST равно +6, поэтому вы должны добавить 6 часов к GMT).
Проверьте Дата документы на наличие функции date_default_timezone_set().
Просто помните, что при записи в базу данных вам нужно будет изменить часовые пояса, сохранить дату, а затем вернуться обратно. Точно так же, когда вы получаете дату, не забудьте добавить смещение часового пояса.
Извините, но я все еще не понимаю, к чему вы клоните. Не могли бы вы привести пример, где пользователь указывает свой часовой пояс, а сервер находится, скажем, в Далласе.
Вам необходимо использовать часовой пояс Далласа (при условии, что сервер настроен на этот часовой пояс) для преобразования в 0 смещение по Гринвичу. Затем, если пользователь указывает Нью-Йорк в качестве часового пояса, легко преобразовать смещение 0 GMT в EST.
Другими словами, 2:30 утра по тихоокеанскому времени (GMT-8) - это 10:30 утра по Гринвичу, за исключением 10:30 утра в MYSQL, при извлечении из базы данных для EST (GMT-5) вы увидите 5:30 утра ... 8 и -5 - часы.
Используйте Unix Time везде. Он использует UTC, поэтому он одинаков для всех часовых поясов. Методы для дат обычно конвертируются в него и обратно, используя имеющуюся у них информацию о часовом поясе, так что у вас будет правильное время.
В качестве альтернативы вы можете использовать Unix Time только для передачи времени с одного компьютера на другой (например, из БД на ваш сервер с PHP или клиенту JavaScript). Есть функции для преобразования в него и из него на всех языках. Для MySQL это:
UNIX_TIMESTAMP(date)
FROM_UNIXTIME(unix_timestamp)
Таким образом, ваше время может быть правильно отформатировано в БД и в журналах, но при этом везде будет правильное местное время.
Как мне это реализовать? NOW () в MySQL учитывает часовой пояс
UNIX_TIMESTAMP () ... неважно. Единственная проблема в том, что мне нравится использовать DATETIME, потому что на него приятнее смотреть, нет ошибки 2038.
Вы можете использовать временную метку только для передачи времени между компьютерами. Я отредактировал ответ, чтобы отразить это.
Только примечание: 19 января 2038 года метка времени Unix перестанет работать из-за 32-битного переполнения. До этого момента миллионы приложений должны будут либо принять новое соглашение для меток времени, либо перейти на 64-битные системы, что позволит выиграть для метки времени «немного» больше времени.
MySQL-сервер хранит даты в формате, не зависящем от часового пояса (UTC). Но до того, как он сохранит дату, он будет преобразован с использованием своего часового пояса.
Вы можете изменить часовой пояс mysql для каждого соединения * 1:
mysql_query('SET time_zone = "'.$timezone.'"');
Вы также можете изменить часовой пояс для каждого скрипта.
date_default_timezone_set($timezone);
Если вы установите для них один и тот же часовой пояс, «2009-01-10 13:30:00» будет означать одно и то же как для mysql, так и для php.
Но имейте в виду, что у двух серверов разные значения внутренних часов, поэтому, если вы хотите генерировать временные метки на основе текущего времени. Сделайте это в mysql ИЛИ php.
* 1) Для поддержки часовых поясов MySQL может потребоваться дополнительная настройка. проверьте руководство по эксплуатации
Я предпочитаю использовать дату и время в исходной форме по отношению к среде, то есть временные метки Unix в полях PHP и DATE / TIME / DATETIME / TIMESTAMP в MySQL. Я перевожу оба значения в другое, используя FROM_UNIXTIME() и UNIX_TIMESTAMP(). Я предпочитаю это вместо временных меток Unix, потому что родные даты / время намного легче читать.
Ваш ответ недостаточно ясен. Есть несколько вещей, которые нужно настроить: часовой пояс PHP, часовой пояс MySQL и часовой пояс сервера. Вы хотите сказать, что я должен установить часовой пояс MySQL в GMT?