Разделы сайта
Выбор редакции:
- Черный экран при загрузке Windows: что делать, если компьютер не включается
- Учётная запись Как узнать название своей учетной записи майкрософт
- Быстрое и полное форматирование: Различия Чем отличается быстрое форматирование от полного
- Как в брандмауэре добавить программу в исключения?
- Публикации Создание точки восстановления
- Как написать и подать бланк претензии в МТС: разбираем образец документа для защиты прав Мтс образец заполнения заявления на смену владельца
- Прошивка htc desire 300. Подготовка к прошивке
- Обзор USB кабелей с магнитным адаптером
- Как купить криптовалюту EOS за рубли По их словам, эти достоинства таковы
- Что влияет на скорость работы компьютера Что зависит от процессора в играх
Реклама
Php установить часовой пояс. Правильный взгляд на временные зоны в PHP. Установка временной зоны на виртуальном хостинге |
21 марта 2013 в 12:58
Dater - определяет часовой пояс, локализует и форматирует время в PHP
Когда при разработке веб-проекта встаёт задача учёта часовых поясов пользователей, то каждый раз решение как будто приходится изобретать заново. Из множества известных мне проектов решивших эту задачу я не припомню ни одного решения, которое можно было бы назвать простым, прозрачным для всей архитектуры и универсальным. А что если хочется просто несколько строчек кода, и чтобы весь остальной код никогда не узнал, что данные клиенту нужно отдавать в другом часовом поясе, и что в данных пришедших от клиента время может быть указано с часовым поясом отличным от серверного? Для решения этой и многих других задач, сегодня я расскажу вам про одну лаконичную и функциональную библиотеку для PHP. И так, встречайте - Dater , и его основные возможности:
Биндинг форматовПозволяет стандартизовать для проекта набор используемых форматов и работать с ними по имени:$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();
= $timezoneDetector->getHtmlJsCode() ?> Теперь все строки 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(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например = $dater->date($datetimeOrTimestamp) ?> . О проектеЧестно признаюсь, что являюсь автором этой библиотеки, и буду очень благодарен за любую критику и помощь в доработке. Исходники выложены наЕсли в процессе управления виртуальным хостингом возникла необходимость изменить часовой пояс по умолчанию, то такое действие можно с лёгкостью выполнить в несколько шагов, которые описаны ниже. Смена часового пояса через Select PHP VersionДля того, чтобы изменить часовой пояс перейдите в cPanel -> Программное обеспечение -> Select PHP Version -> Switch to PHP options . Следующим шагом будет изменение значения переменной date.timezone на необходимый вам часовой пояс. Со списком доступных часовых поясов вы сможете ознакомиться в последнем пункте статьи. После внесения необходимых изменений важно нажать на кнопку «Сохранить изменения» , которая расположена внизу страницы PHP Selector . Чтобы убедиться в том, что указанное значение timezone было применено, можно воспользоваться PHP-функцией phpinfo() , которая отображает информацию о всех установленных параметрах php. Для этого создайте в public_html нажмите на кнопку «Файл» в меню диспетчера.
После этого сохраните файл и откройте его в браузере. В данном примере файл будет доступен по адресу: 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 Хотите новое имя для веб-сайта? У нас доступна date_default_timezone_set utc (6)new PDO("mysql:host=localhost;dbname=nametable", "username", "password", ); php $finalize_at = date ("Y-m-d H:i:s" ); ?>Эти даты необходимо сравнить в MySQL с помощью функции NOW() чтобы вернуть разницу в часах, например: SELECT TIMESTAMPDIFF ( hour , NOW (), finalize_at ) FROM plans ;Но проблема в том, что дата даты функции PHP date("Ymd H:i:s") использует настройку часового пояса PHP, а функция NOW() занимает время MySQL с сервера MySQL. Я пытаюсь решить это:
И часовой пояс для MySQL не меняется. Есть ли способ изменить часовой пояс для PHP и MySQL без необходимости делать это с консоли MySQL или установить изменение часового пояса где-то в php.ini и сделать эти значения доступными как для PHP, так и для MySQL. Очень ценю вашу поддержку. Вы можете сделать это легко только двумя строками PHP. $tz = (new DateTime ("now" , new DateTimeZone ("Asia/Kabul" )))-> format ("P" ); $pdo -> exec ("SET time_zone="$tz";" );Для PHP используйте эту функцию: date_default_timezone_set () default - time - zone = "timezone"Если у вас есть привилегия root , вы можете установить значение глобального часового сервера во время выполнения с помощью этого оператора: SET GLOBAL time_zone = timezone ;Часовой пояс за соединение. Каждый клиент, который подключается, имеет свой собственный часовой пояс, заданный time_zone variable . Первоначально переменная сеанса принимает свое значение из global time_zone переменной global time_zone , но клиент может изменить свой собственный часовой пояс с помощью этого оператора: SET time_zone = timezone ;Лучший метод Установите часовой пояс в PDO MySQL: При необходимости, по ошибке вы можете использовать: date ("P") Пример: new PDO ("mysql:host=localhost;dbname=nametable" , "username" , "password" , [ PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;SET time_zone = "" . date ("P" ). """ ]);Я могу изменить свой часовой пояс mysql по умолчанию из раздела переменных, отредактировав строку, которая говорит «часовой пояс» в phpmyadmin. Здесь вы также можете изменить формат и многое другое, которое вы можете найти в поддержке mysql http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html , я надеюсь, что он вам поможет. $unsafe_variable = (is_numeric($_POST["user_input"]) ? $_POST["user_input"] : ""); И гораздо лучше использовать эти функции для проверки входных данных mysql_real_escape_string . Если вы заметили, что время на вашем сайте не совпадает с вашим часовым поясом и вы хотели бы его поправить, то для этого существует несколько способов. Большинство виртуальных хостингов запрещает редактирование этого файла, но не отчаивайтесь, достигнуть того же результата можно внеся некоторые изменения в файл.htaccess. В данном руководстве вы узнаете, как изменить часовой пояс вашего сайта. Перед тем, как вы начнёте это руководство, вам понадобится следующее:
Шаг 1 - Поиск и редактирование файла.htaccessФайл .htaccess находится в каталоге public_html . Вы можете открыть его с помощью Файлового Менеджера в вашей панели управления хостингом или подключившись к вашей учётной записи через FTP-клиент (например, FileZilla). Данные руководства детально рассказывают об обоих способах: Шаг 2 - Поиск правильного часового поясаСписок всех поддерживаемых часовых поясов может быть найден на этом сайте . Во-первых, выберите свой регион. Теперь выберите часовой пояс, который вы хотите использовать. В нашем случае, мы выберем Europe/Moscow. Шаг 3 - Настройка часового пояса через.htaccessПосле того, как вы узнаете формат вашего часового пояса, откройте файл .htaccess . После этого, добавьте следующий код в самый верх файла .htaccess : Php_value date.timezone "Europe/Moscow" ВАЖНО! Вместо Europe/Moscow впишите нужный вам часовой пояс. Поздравляем, вы успешно изменили часовой пояс вашего сайта! ЗаключениеЭто краткое руководство рассказало вам о том, как изменить часовой пояс на сайте через.htaccess. Теперь вам не нужно беспокоиться о неправильном времени на вашем сайте. |
Читайте: |
---|
Популярное:
Новое
- Учётная запись Как узнать название своей учетной записи майкрософт
- Быстрое и полное форматирование: Различия Чем отличается быстрое форматирование от полного
- Как в брандмауэре добавить программу в исключения?
- Публикации Создание точки восстановления
- Как написать и подать бланк претензии в МТС: разбираем образец документа для защиты прав Мтс образец заполнения заявления на смену владельца
- Прошивка htc desire 300. Подготовка к прошивке
- Обзор USB кабелей с магнитным адаптером
- Как купить криптовалюту EOS за рубли По их словам, эти достоинства таковы
- Что влияет на скорость работы компьютера Что зависит от процессора в играх
- Сброс до заводских настроек Windows Как сбросить все настройки на windows 8