Как задать часовой пояс php. Date timezone - Установить часовой пояс в PHP и MySQL. Dater - определяет часовой пояс, локализует и форматирует время в PHP

Иногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.

Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.

Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о CMS, в которых поправка часового пояса обычно присутствует прямо в интерфейсе администратора.

В первую очередь проверьте текущее состояние с помощью PHP-кода:

echo ini_get("date.timezone");

Хорошо, если у вас свой сервер и имеется доступ к php.ini, где можно задать нужную временну́ю зону и забыть. Например, таким образом:

Date.timezone = Europe/Moscow

Правда, если на сервере размещены несколько проектов, в которых должны поддерживаться различные часовые пояса, тогда лучше этого не делать. В этом случае будет правильнее задать временные зоны только для проектов, где один часовой пояс.

Установка временной зоны на виртуальном хостинге

На виртуальном хостинге, доступа к конфигам сервера чаще всего нет. Поэтому, в первую очередь попробуйте задать временну́ю зону с помощью .htaccess . Просто найдите или создайте в корне своего сайта файл.htaccess и добавьте в него такую строку:

Php_value date.timezone "Europe/Moscow"

Если способ не сработает, тогда воспользуемся функцией date_default_timezone_set() , которая устанавливает временную зону по-умолчанию для всех функций даты и времени. Для этого нужно где-нибудь в начале скрипта просто добавьте такую строку:

Date_default_timezone_set("Europe/Moscow");

Естественно, Europe/Moscow меняется на необходимый вам часовой пояс. Для территории РФ в PHP поддерживаются следующие временные зоны:

  • Europe/Moscow
  • Europe/Samara
  • Europe/Kaliningrad
  • Europe/Volgograd
  • Asia/Anadyr
  • Asia/Kamchatka
  • Asia/Krasnoyarsk
  • Asia/Magadan
  • Asia/Novokuznetsk
  • Asia/Novosibirsk
  • Asia/Omsk
  • Asia/Sakhalin
  • Asia/Vladivostok
  • Asia/Yakutsk
  • Asia/Yekaterinburg

Со списком всех доступных временных зон можно ознакомиться по ссылке или выполнить команду, которая возвратит вам список временных зон, доступных на вашем сервере.

Print_r(DateTimeZone::listIdentifiers());

пояса автоматическое (6)

Мне нужно знать, в какой часовом поясе находятся мои пользователи, на основе их IP или HTTP-заголовка.

Я получил много ответов на этот вопрос, но я не мог понять ответ. Некоторые говорят, что использование -new Date().getTimezoneOffset()/60 (). Но что это значит?

У меня есть date_default_timezone_set("Asia/Calcutta"); в корне моей страницы (index.php). Поэтому для этого я должен динамически установить часовой пояс и установить его вместо Asia/Calcutta .

Answers

Информация о часовом поясе браузера не является частью спецификации HTTP, поэтому вы не можете просто получить ее из заголовка.

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

Существуют некоторые стратегии, которые вы можете использовать, чтобы попытаться определить часовой пояс, например, используя библиотеку jsTimeZoneDetect , которая является отличной отправной точкой, но недостаточно несовершенна, что вы не можете просто полагаться только на нее. Если вы используете moment.js, в момент-времени есть встроенная функция, называемая moment.tz.guess() которая делает то же самое.

Идея использования функции getTimezoneOffset() JavaScript ошибочна в том, что вы не получаете часовой пояс - только одно смещение для определенной даты. См. Раздел wiki темы тегов TimeZone под названием «TimeZone! = Offset».

Однако вы смотрите на это, в конечном счете, вам нужно решить один из двух подходов:

  • Попросите пользователя рассказать вам о своем часовом поясе, из какого-либо раскрывающегося списка или управления тайм-зонами на основе карт .
  • Отправляйте время только браузеру в UTC и используйте JavaScript в браузере для преобразования в любой локальный часовой пояс, к которому пользователь может установить свой компьютер.

Я обсуждаю это более подробно (с точки зрения AC #) в этом ответе.

Часовой пояс недоступен в заголовке HTTP, но страна (аббревиатура) находится в заголовке ACCEPT_LANGUAGE. Это будет нечто вроде «en-US» (США - код страны). Это можно комбинировать с информацией JavaScript, чтобы получить представление о часовом поясе пользователя.

Это то, что я использую в JS:

Function timezone() { var now = new Date(); var jano = new Date(now.getFullYear(), 0, 1).getTimezoneOffset()/-60; var julo = new Date(now.getFullYear(), 6, 1).getTimezoneOffset()/-60; var tz = Math.min(jano, julo); if (jano != julo) tz += ((jano < julo) ? "S" : "W") + Math.abs(jano - julo); return tz; }

Это возвращает строку типа «-6S1» для центральной зоны (стандартное смещение по времени на -6 часов, летнее время действует летом и добавляет 1 час). Я использую cookie, чтобы сделать это доступным для PHP. PHP ищет базу данных TZ для зон, которые соответствуют этому, и страны. Для здесь (US, -6S1) существует 7 соответствующих зон, первая - «Америка / Чикаго».

Кстати, в базе данных есть две зоны, где DST добавляет что-то, кроме 1 часа: лорд-Хоу-Айленд (10.5W0.5) и Тролль-станция, Антарктида (0W2).

Одно из них - спросить их! Особенно в тех системах членов, где вы можете захватить / зарегистрировать пользователя - дать им выбор в этот момент. Простой, но точный.

Это прекрасно работает...

Echo
Теперь все строки YYYY-MM-DD HH:MM:SS в отправляемых данных будут заменены на YYYY-MM-DD HH:MM:SS в автоматически определённом часовом поясе клиента. Если же вам нужно выводить дату-время в определённом формате, то достаточно добавить YYYY-MM-DD HH:MM:SS[Н m d] или YYYY-MM-DD HH:MM:SS где date - забинденный в Dater формат. Также можно выводить и форматировать timestamp формат: 1363853607.

Например, следующие данные

Timestamp format: 1363238564 (не изменится) Timestamp format: 1363238564 Timestamp format: 1363238564 Server datetime format: 2013-03-14 09:22:44 Server datetime format: 2013-03-14 09:22:44 Server datetime format: 2013-03-14 09:22:44
Будут автоматически конвертированы в

Timestamp format: 1363238564 (не изменится) Timestamp format: 2013/03/14 Timestamp format: 14.03.2013 07:22 Server datetime format: 2013/03/14 Server datetime format: 07:22 Server datetime format: 2013-03-14 07:22:44

В то же время $dataHandler->convertRequestDataToServerTimezone(); сделает так, что все YYYY-MM-DD HH:MM:SS данные поступающие от клиента будут конвертированы в YYYY-MM-DD HH:MM:SS часового пояса сервера. Таким образом сервер никогда не узнает о том, что клиент получает и отправляет дату-время в другом часовом поясе.

Стоит признать, что это немножко экстремальный вариант обработки часовых поясов. Более универсальным и традиционным решением было бы отказаться от использования $dataHandler->enableOutputTimezoneHandler(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например .

О проекте Честно признаюсь, что являюсь автором этой библиотеки, и буду очень благодарен за любую критику и помощь в доработке. Исходники выложены на
  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то