Иногда требуется сделать такой сайт, на котором время будет подстраиваться под часовой пояс пользователя. Задача эта непростая в том плане, что определить часовой пояс пользователя проблемно. Поэтому выводят в 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. Безусловно, можно и не ставить по умолчанию время по Гринвичу, а узнавать смещение относительно серверного времени. Впрочем, о смещении мы с Вами поговорим в следующей статье.
Создано 01.03.2013 11:05:23
Михаил Русаков
Иногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.
Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.
Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о CMS, в которых поправка часового пояса обычно присутствует прямо в интерфейсе администратора.
В первую очередь проверьте текущее состояние с помощью PHP-кода:
echo ini_get('date.timezone');
</pre>
Хорошо, если у вас свой сервер и имеется доступ к php.ini, где можно задать нужную временну́ю зону и забыть. Например, таким образом:
date.timezone = Europe/Moscow
</pre>
Правда, если на сервере размещены несколько проектов, в которых должны поддерживаться различные часовые пояса, тогда лучше этого не делать. В этом случае будет правильнее задать временные зоны только для проектов, где один часовой пояс.
Установка временной зоны на виртуальном хостинге
На виртуальном хостинге, доступа к конфигам сервера чаще всего нет. Поэтому, в первую очередь попробуйте задать временну́ю зону с помощью .htaccess. Просто найдите или создайте в корне своего сайта файл .htaccess и добавьте в него такую строку:
php_value date.timezone "Europe/Moscow"
</pre>
Если способ не сработает, тогда воспользуемся функцией date_default_timezone_set(), которая устанавливает временную зону по умолчанию для всех функций даты и времени. Для этого нужно где-нибудь в начале скрипта просто добавьте такую строку:
date_default_timezone_set('Europe/Moscow');
</pre>
Естественно, 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());
</pre>
Подпишитесь на мой телеграм и первыми получайте новые материалы, в том числе которых нет на сайте.
Из-за постоянных изменений с переходом на зимнее-летнее время в РФ это самое время может отображаться на вашем сайте и на сервере некорректно. К тому же время PHP (если собран без опции —with-system-tzdata) и системное время — разные вещи. Поэтому нужно проводить две настройки. Как-то помучился с поиском решения, разрозненной информации в инете полно, вот «комплексное» решение этой проблемки, делюсь… У меня «родная» временная зона Europe/Moscow, но время на сервере бежало вперёд на час, поэтому я корректировал на сервере и в php таймзону на Europe/Kaliningrad. Для PHP прописал в etc/php5/apache2/php.ini:
date.timezone = "Europe/Kaliningrad"
Но это как бы «костыли». Будем делать «по феншую»… Для PHP нужно установить или обновить timezonedb:
pecl install timezonedb
или
pecl upgrade timezonedb
подключить расширение:
echo "extension=timezonedb.so" > /etc/php5/conf.d/timezonedb.ini
Перезапускаем веб-сервер и радуемся… Если у вас не обновлялась база часовых поясов в системе, то загружаем и ставим последнюю версию:
mkdir ~/timezone cd ~/timezone wget ftp://ftp.iana.org/tz/tzdata-latest.tar.gz tar zxvf tzdata-latest.tar.gz zic europe ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
В некоторых дистрибутивах Linux вместо ссылки используется копирование скомпилированного файла в /etc/localtime. Не забудьте убрать «костыли», если подбирали подходящую зону для корректировки времени.Используемые источники:
- https://myrusakov.ru/php-tz-time.html
- https://danilin.biz/php-set-timezone.htm
- https://habr.com/post/269449/