Если в процессе управления виртуальным хостингом возникла необходимость изменить часовой пояс по умолчанию, то такое действие можно с лёгкостью выполнить в несколько шагов, которые описаны ниже.
Для того, чтобы изменить часовой пояс перейдите в cPanel -> Программное обеспечение -> Select PHP Version -> Switch to PHP options .
Следующим шагом будет изменение значения переменной date.timezone на необходимый вам часовой пояс. Со списком доступных часовых поясов вы сможете ознакомиться в последнем пункте статьи.
После внесения необходимых изменений важно нажать на кнопку «Сохранить изменения» , которая расположена внизу страницы PHP Selector .
Чтобы убедиться в том, что указанное значение timezone было применено, можно воспользоваться PHP-функцией phpinfo() , которая отображает информацию о всех установленных параметрах php. Для этого создайте в public_html нажмите на кнопку «Файл» в меню диспетчера.
- В поле Новое имя файла укажите, например, phpinfo.php после чего нажмите на кнопку Create New File .
- В результате файл с указанным именем появится в списке остальных на хостинге.
- Далее необходимо открыть этот файл для редактирования. Для этого кликните левой кнопкой мыши на нужном файле, после чего в меню диспетчера нажмите на кнопку Изменить .
- В появившейся форме оставляете все параметры по умолчанию и нажимаете на кнопку Edit , для открытия текстового редактора.
- В открывшемся окне необходимо указать следующий код:
После этого сохраните файл и откройте его в браузере. В данном примере файл будет доступен по адресу:
http://главный_домен/phpinfo.php
В открывшейся странице найдите раздел date , в котором будет расположена таблица со значением текущего часового пояса. В данном случае отображается указанная выше зона Europe/Kiev .
На этом процесс изменения timezone окончен.
Список часовых поясов для настройки timezoneВ дополнение прилагаем ниже список возможных значений часового пояса:
Africa/Cairo Africa/Casablanca Africa/Harare Africa/Monrovia Africa/Nairobi America/Bogota America/Buenos_Aires America/Caracas America/Chihuahua America/La_Paz America/Lima America/Mazatlan America/Mexico_City America/Monterrey America/Santiago America/Tijuana Asia/Almaty Asia/Baghdad Asia/Baku Asia/Bangkok Asia/Chongqing Asia/Dhaka Asia/Hong_Kong Asia/Irkutsk Asia/Jakarta Asia/Jerusalem Asia/Kabul Asia/Karachi Asia/Kathmandu Asia/Kolkata Asia/Krasnoyarsk Asia/Kuala_Lumpur Asia/Kuwait Asia/Magadan Asia/Muscat Asia/Novosibirsk Asia/Riyadh Asia/Seoul Asia/Singapore Asia/Taipei Asia/Tashkent Asia/Tbilisi Asia/Tehran Asia/Tokyo Asia/Ulaanbaatar Asia/Urumqi Asia/Vladivostok Asia/Yakutsk Asia/Yekaterinburg Asia/Yerevan Atlantic/Azores Atlantic/Cape_Verde Atlantic/Stanley Australia/Adelaide Australia/Brisbane Australia/Canberra Australia/Darwin Australia/Hobart Australia/Melbourne Australia/Perth Australia/Sydney Canada/Atlantic Canada/Newfoundland Canada/Saskatchewan Europe/Amsterdam Europe/Athens Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels Europe/Bucharest Europe/Budapest Europe/Copenhagen Europe/Dublin Europe/Helsinki Europe/Istanbul Europe/Kiev Europe/Lisbon Europe/Ljubljana Europe/London Europe/Madrid Europe/Minsk Europe/Moscow Europe/Paris Europe/Prague Europe/Riga Europe/Rome Europe/Sarajevo Europe/Skopje Europe/Sofia Europe/Stockholm Europe/Tallinn Europe/Vienna Europe/Vilnius Europe/Volgograd Europe/Warsaw Europe/Zagreb Greenland Pacific/Auckland Pacific/Fiji Pacific/Guam Pacific/Midway Pacific/Port_Moresby US/Alaska US/Arizona US/Central US/Eastern US/East-Indiana US/Hawaii US/Mountain US/Pacific US/Samoa
Хотите новое имя для веб-сайта? У нас доступна
21 марта 2013 в 12:58 Dater - определяет часовой пояс, локализует и форматирует время в PHP- PHP
Когда при разработке веб-проекта встаёт задача учёта часовых поясов пользователей, то каждый раз решение как будто приходится изобретать заново. Из множества известных мне проектов решивших эту задачу я не припомню ни одного решения, которое можно было бы назвать простым, прозрачным для всей архитектуры и универсальным.
А что если хочется просто несколько строчек кода, и чтобы весь остальной код никогда не узнал, что данные клиенту нужно отдавать в другом часовом поясе, и что в данных пришедших от клиента время может быть указано с часовым поясом отличным от серверного? Для решения этой и многих других задач, сегодня я расскажу вам про одну лаконичную и функциональную библиотеку для PHP.
И так, встречайте - Dater , и его основные возможности:
- Биндинг форматов
- Локализация текстов и форматов
- Расширение списка опций форматирования
- Автоопределение часового пояса
- Конвертация времени с учётом часового пояса
- Автоматическая конвертация времени в $_GET, $_POST, $_REQUEST с учётом часового пояса
- Автоматическая конвертация часового пояса в шаблоне отправляемых данных
$dater = new Dater\Dater(new Dater\Locale\En()); $dater->format(time(), "d/m/Y"); // 2013/03/14 $dater->addFormat("slashedDate", "d/m/Y"); $dater->format(time(), "slashedDate"); // 2013/03/14 $dater->slashedDate(time()); // 2013/03/14
Расширение опций форматирования Доступны все опции форматирования из date() , которые также могут быть переопределены и расширены:$dater->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(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например .
О проекте Честно признаюсь, что являюсь автором этой библиотеки, и буду очень благодарен за любую критику и помощь в доработке. Исходники выложены наИногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.
Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.
Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о 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