Интернет. Социальные сети. Антивирусы. Мультимедиа

Установка часового пояса в php. Установка временнОй зоны в PHP. Стандартные методы для серверных и пользовательских форматов с учётом локали


Это небольшая статья о том, как работать с временными зонами при хранении значений даты / времени в базе данных. Базы данных или язык программирования, который вы решите использовать, решающего значения не имеет, так как описываемые в статье явления универсальны. Свои действия я буду показывать на примере использования связки MySQL и PHP. Проблема, связанная с временными зонами, достаточно банальна. Многие часто забывают об их существовании, а некоторые считают их чем-то чрезмерно сложным. Обычно при настройке базы данных или при пользовании услугами веб-хостинга ваши временные зоны настроены по умолчанию. Настройки по умолчанию подойдут, если вы работаете с одним сервером, но что произойдет, если вы решите переместить его?

Тот же вопрос закономерен, если у вас несколько серверов в разных местах.
Вместо того чтобы хранить временные зоны с указанием каждой даты, лучше взять за основу стандартное время и связать все ваши даты с ним. Такой способ позволяет сделать переход на стандартное время до того, как значение будет сохранено в базе данных. Вообще, хорошая идея - просто использовать UTC +00:00 .

Что такое UTC

Формат UTC расшифровывается как «Всемирно координированное время» и является преемником «Среднего времени по Гринвичу» (GMT). Эти два формата практически идентичны, но UTC считается принятым стандартом. В общем, UTC основывается на выделении 40 различных временных зон. За точку отсчета в UTC принято брать 00:00 часов. Итого получается 12 основных временных зон, как с положительным, так и с отрицательным значением, а также некоторые дополнительные временные зоны, вроде получасовых UTC +04:30 . Идея состоит в том, что если у вас есть временная зона UTC -05: 00 , то вам придется вычесть 5 часов от начального UTC +00:00 , чтобы добиться нужного соответствия. То есть, если это 14:00 (или 2 часа вечера) а ваша временная зона UTC-05: 00 (EST или Восточный часовой пояс), то UTC +00:00 будет равен 19:00 (или 7 часам вечера).
  • Графическое представление мировых временных зон (Wikipedia)
  • Список сокращений временных зон (Wikipedia)

Хранение времени в формате UTC +00:00

Первое, что мы должны сделать, - определиться, какую временную зону использовать для хранения всех наших значений. Я настоятельно рекомендую взять за основу UTC +00:00 - без особой причины, кроме как той, что ее легко запомнить и 0 представляет собой идеальную точку отсчета. Так как мы знаем, что все даты указаны в UTC +00:00 , становится гораздо легче представлять надлежащее время для каждого пользователя на основе их личных временных зон. После того как пользователь выбрал (или у нас есть автоопределение) свой часовой пояс, вывод соответствующего времени для этого пользователя становится обычным делом.

Установка временной зоны по умолчанию

Полагая, что все наши даты / время хранятся в формате UTC, мы можем просто установить по умолчанию временную зону, которая будет использоваться для отображения каждого времени. Это позволит автоматически подобрать дату и время для конкретного пользователя. В PHP все, что нам нужно сделать, - это установить временную зону, например, так:
date_default_timezone_set("EST");
Мы можем сделать это в каком-нибудь блоке инициализации в начале нашего кода - и все готово: все даты будут отображаться надлежащим образом для того часового пояса, в котором находится пользователь.

Если мы хотим получить полный контроль над датой и временем, мы можем построить функцию следующим образом:
function get_date($date) { date_default_timezone_set("EST"); $date = date("Y-m-d H:i:s", strtotime($date)); date_default_timezone_set("UTC"); return $date; }

Настройка PHP под UTC +00:00

Конечно, все было бы не так просто, если бы мы не настроили нашу систему под UTC, как временную зону по умолчанию. Я уверен, что это может быть сделано примерно одинаково и в других языках, но PHP это делается следующим образом:
date.timezone = UTC
Теперь всякий раз, когда мы используем такие вещи, как, например, функцию time() , это автоматически дает нам время в формате UTC с соответствующим смещением на основе нашего серверного времени. Если мы захотим настроить даты, в такой базе данных как MySQL, сделаем так:
date("Y-m-d H:i:s", time());
Если у нас не было доступа к изменению конфигурации PHP, то мы должны настроить время вручную при установке даты, вот так:
date("Y-m-d H:i:s", time() - date("Z"));

Настройка MySQL под UTC +00:00

Непосредственная установка даты, как мы делали выше, применима, если у нас нет доступа к изменению параметров конфигурации MySQL. Тем не менее, если мы хотим использовать TIMESTAMP , которая обычно самообновляется, или такую функцию даты из MySQL, как NOW() , то мы должны настроить MySQL для использования UTC в качестве временной зоны по умолчанию.

В MySQL это делается путем установки UTC смещения, которое может быть сделано так же легко, как это было в PHP, путем внесения следующих изменений:
default-time-zone = "+00:00"

Обновление существующих дат / времени

Если вы решили стандартизировать временные зоны при помощи UTC, где временной зоной по умолчанию является UTC +00:00 смещение, то теперь ваш текущее время в вашей базе данных будет неработоспособно.

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

ПРИМЕЧАНИЕ: Если у вас есть какие-нибудь временные метки, то их нужно обновить в первую очередь.

Мы можем осуществлять поиск по всем полям даты и времени в нашей базе с помощью следующего запроса:
SELECT * FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA`="table_name" AND (`DATA_TYPE`="timestamp" OR `DATA_TYPE`="datetime" OR `DATA_TYPE`="date");
Отсюда мы можем использовать следующий запрос, чтобы обновить даты / время в наших таблицах:
UPDATE `table_name` SET `timestamp`=CONVERT_TZ(`timestamp`, "-05:00", "+00:00");
Где -05:00 - текущая временная зона, в формате которой хранится время (она как и в предыдущем случае относится к Восточной). Временная зона +00:00 , в которую мы хотим преобразовать, в данном случае относится к UTC.

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

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

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

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

date_default_timezone_set("UTC"); // Устанавливаем часовой пояс по Гринвичу
$time = time(); // Вот это значение отправляем в базу
$offset = 3; // Допустим, у пользователя смещение относительно Гринвича составляет +3 часа
$time += 3 * 3600; // Добавляем 3 часа к времени по Гринвичу
echo date("Y-m-d H:i:s", $time); // Выводим время пользователя, согласно его часовому поясу
?>

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

Если в процессе управления виртуальным хостингом возникла необходимость изменить часовой пояс по умолчанию, то такое действие можно с лёгкостью выполнить в несколько шагов, которые описаны ниже.

Смена часового пояса через Select PHP Version

Для того, чтобы изменить часовой пояс перейдите в 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

Хотите новое имя для веб-сайта? У нас доступна

Настройка часового пояса (по умолчанию) очень необходим для правильной обработки данных. Эта статья «Настройка Timezone в php.ini» поможет вам узнать, как можно настроить часовой пояс в файле конфигурации PHP (php.ini) или внутри любого PHP-скрипта для временного использования.

Настройка Timezone в php.ini

Для установки часового пояса по умолчанию для вашей PHP среды, выполните следующие 4 простых шага.

1. Необходимо найти конфигурационный файл php.ini и это можно сделать:

# find / -type f -name php.ini

По умолчанию php.ini лежит в:

Для CentOS,RedHat или Fedora будет лежать:

/etc/php.ini

Для Ubuntu, Debian или LinuxMint будет лежать:

/etc/php5/apache2/php.ini

2. Следующим действием будет поиск временных зон (для вашей локации), для этого, стоит посетить сайт и найти свою зону для php:

3. Прописываем найденную зону в файл php.ini. Для примера, я возьму свою зону — ‘Europe/Kiev’. Открываем конфигурационный файл и делаем изменения:

[...] date.timezone = "Europe/Kiev" [...]

ВНИМАНИЕ! Поищите опцию «date.timezone» в данном файле, возможно данный параметр уже прописан.
4. Перезапускаем веб-сервер:

# service httpd restart

# service apache2 restart

Если другой сервер (nginx, tomcat, lighttpd), то перезапустите его.

Так же, можно прописать данный параметр в самом php файле следующим образом:

Настройка Timezone в php.ini завершена.

Если вы заметили, что время на вашем сайте не совпадает с вашим часовым поясом и вы хотели бы его поправить, то для этого существует несколько способов. Большинство виртуальных хостингов запрещает редактирование этого файла, но не отчаивайтесь, достигнуть того же результата можно внеся некоторые изменения в файл.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. Теперь вам не нужно беспокоиться о неправильном времени на вашем сайте.

Вам также будет интересно:

Как скачивать презентации с интернета
Примечание: Указанные ниже действия применяются только к PowerPoint 2007. Вы не можете...
Сервисный центр 1с управление сервисным центром
"1С:Управление сервисным центром" – отраслевое решение, которое предназначено для...
Как удалить помеченные на удаление в 1с
На заметку: если нижеприведенные рекомендации непонятны для Вас, а в информационной базе...
Мой опыт работы промоутером
Полезная статья для студентов и школьников, которые хотели бы немного подзаработать в...
Визитки по компьютерной помощи: дешево и профессионально!
Визитки, предназначенные для рекламы услуг по диагностике и ремонту компьютеров или...