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

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

Перед тем, как вы начнёте это руководство, вам понадобится следующее:

  • Доступ к панели управления хостингом или FTP
Шаг 1 - Поиск и редактирование файла.htaccess

Файл .htaccess находится в каталоге public_html . Вы можете открыть его с помощью Файлового Менеджера в вашей панели управления хостингом или подключившись к вашей учётной записи через FTP-клиент (например, FileZilla). Данные руководства детально рассказывают об обоих способах:

Шаг 2 - Поиск правильного часового пояса

Список всех поддерживаемых часовых поясов может быть найден на этом сайте .

Во-первых, выберите свой регион.

Теперь выберите часовой пояс, который вы хотите использовать. В нашем случае, мы выберем Europe/Moscow.

Шаг 3 - Настройка часового пояса через.htaccess

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

Php_value date.timezone "Europe/Moscow"

ВАЖНО! Вместо Europe/Moscow впишите нужный вам часовой пояс.

Поздравляем, вы успешно изменили часовой пояс вашего сайта!

Заключение

Это краткое руководство рассказало вам о том, как изменить часовой пояс на сайте через.htaccess. Теперь вам не нужно беспокоиться о неправильном времени на вашем сайте.

Иногда требуется сделать такой сайт, на котором время будет подстраиваться под часовой пояс пользователя . Задача эта непростая в том плане, что определить часовой пояс пользователя проблемно. Поэтому выводят в 99% случаев время, соответствующее серверному часовому поясу. Но давайте с Вами разберём, как всё-таки можно вывести время с учётом временной зоны конкретного пользователя .

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

Лучше всего будет поставить серверное время по Гринвичу . И сохранять надо все данные со временем именно по Гринвичу. Я уже когда-то писал, что хранить надо в той же базе данных не строковый формат даты и времени, а числовой , то есть тот, который возвращается функцией time() .

Давайте с Вами разберём небольшой код:

Примерно так и работает вывод времени с учётом часового пояса пользователя на PHP . Безусловно, можно и не ставить по умолчанию время по Гринвичу, а узнавать смещение относительно серверного времени. Впрочем, о смещении мы с Вами поговорим в следующей статье.

пояса автоматическое (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 addFormatOption("ago", function (DateTime $datetime) { return floor((time() - $datetime->getTimestamp()) / 86400) . " days ago"; }); $dater->format(time() - 60*60*24*7, "d F Y, ago"); // 14 March 2013, 7 days ago

Поддержка локалей $dater->setLocale(new Dater\Locale\En()); echo $dater->date(); // 03/21/2013 echo $dater->now("j F Y"); // 21 March 2013 $dater->setLocale(Dater\Dater::getLocaleByCode("ru")); echo $dater->date(); // 21.03.2013 echo $dater->now("j F Y"); // 21 марта 2013 Стандартные методы для серверных и пользовательских форматов с учётом локали echo $dater->date(); // 03/21/2013 (client timezone, depends on locale) echo $dater->time(); // 5:41 AM (client timezone, depends on locale) echo $dater->datetime(); // 03/21/2013 5:41 (client timezone, depends on locale) echo $dater->isoDate(); // 2013-03-21 (client timezone) echo $dater->isoTime(); // 05:41:28 (client timezone) echo $dater->isoDatetime(); // 2013-03-21 05:41:28 (client timezone) echo $dater->serverDate(); // 2013-03-21 (server timezone) echo $dater->serverTime(); // 09:41:28 (server timezone) echo $dater->serverDatetime(); // 2013-03-21 09:41:28 (server timezone) Конвертация даты-времени с учётом часового пояса $dater->setServerTimezone("Europe/Moscow"); $dater->setClientTimezone("Europe/London"); echo $dater->serverDatetime(); // 2013-03-21 08:18:06 echo $dater->isoDatetime(); // 2013-03-21 04:18:06 echo $dater->time(); // 04:18
Стоит упомянуть, что при вызове $dater->setServerTimezone("Europe/Moscow"); функция date() и класс DateTime будут возвращать время в новом установленном часовом поясе. Чтобы это отключить передайте методу false вторым параметром.И наконец обещанное Код, который позволит вам автоматически определить часовой пояс клиента и выводить для него актуальную дату-время:

В заголовке глобального скрипта инициализации

$dater = new Dater\Dater(new Dater\Locale\Ru(), "Europe/Moscow"); $timezoneDetector = new Dater\TimezoneDetector(); $dater->setClientTimezone($timezoneDetector->getClientTimezone()); $dataHandler = new Dater\DataHandler($dater); $dataHandler->enableOutputTimezoneHandler(); $dataHandler->convertRequestDataToServerTimezone();
В основном шаблоне


Теперь все строки 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(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например .

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