часовые пояса для php
Установка временнОй зоны в PHP
Иногда возникает такая ситуация, что текущее время на сервере не соответствует вашему текущему часовому поясу или часовому поясу региона, на который ориентирован ваш сайт.
Чтобы было понятно, напомню: территориально Россия очень большая, и далеко не всем нужно, чтобы их сайты «жили» по московскому времени. Например, Урал, Сибирь, Дальний восток и т.д.
Серверы большинства популярных российских хостинг-провайдеров размещены на технологических площадках Москвы и Санкт-Петербурга и по-умолочанию настроены, естественно, на московскую временну́ю зону. Сервер не может автоматически подстраиваться под ваше текущее местоположение и переводить системные часы. В связи с чем, работа функций даты и времени на сайте может быть не совсем корректной. Естественно, сейчас речь не идёт о CMS, в которых поправка часового пояса обычно присутствует прямо в интерфейсе администратора.
В первую очередь проверьте текущее состояние с помощью PHP-кода:
Хорошо, если у вас свой сервер и имеется доступ к php.ini, где можно задать нужную временну́ю зону и забыть. Например, таким образом:
Правда, если на сервере размещены несколько проектов, в которых должны поддерживаться различные часовые пояса, тогда лучше этого не делать. В этом случае будет правильнее задать временные зоны только для проектов, где один часовой пояс.
Установка временной зоны на виртуальном хостинге
Если способ не сработает, тогда воспользуемся функцией date_default_timezone_set(), которая устанавливает временную зону по умолчанию для всех функций даты и времени. Для этого нужно где-нибудь в начале скрипта просто добавьте такую строку:
Естественно, Europe/Moscow меняется на необходимый вам часовой пояс. Для территории РФ в PHP поддерживаются следующие временные зоны:
Со списком всех доступных временных зон можно ознакомиться по ссылке или выполнить команду, которая возвратит вам список временных зон, доступных на вашем сервере.
Делаю сайты на Вордпресс с 2008 года, занимаюсь их оптимизацией, беру на поддержку, делюсь опытом в блоге и соцсетях (ссылки ниже, подпишитесь)
Временные зоны и часовые пояса в PHP
Со временем каждый проект расширяется, одного региона становится мало. Часто посетителю нужно показать время его часового пояса.
date_default_timezone_set — устанавливаем временную зону по умолчанию для всех функций даты/времени в скрипте
Код PHP
Для того, чтобы пользователь на сайте видел время своего часового пояса, можно использовать средства PHP. Пользователю предоставляем выбор (select) его часового пояса, заносим результат в переменную и БД, а переменную в аргумент встроенной функции date_default_timezone_set. В результате время его сообщений, объявлений, заказов будет отображаться согласно его временной зоне. Можно, конечно, обойтись и средствами JavaScript на клиенте, но будет проблема с теми, у кого работа js блокируется Браузером. |
Примеры часовых поясов для PHP
Часть временных зон подписал, чтобы сразу можно было найти нужную. В скрипт вставлять соответственно Часть света/Город, например, Europe/Minsk.
Европа
Europe/Amsterdam (Амстердам, Нидерланды)
Europe/Andorra
Europe/Athens (Афины, Греция)
Europe/Belfast (Белфаст, Северная Ирландия)
Europe/Belgrade (Белград, Сербия)
Europe/Berlin (Берлин, Германия)
Europe/Bratislava (Братислава, Словакия)
Europe/Brussels (Брюссель, Бельгия)
Europe/Bucharest (Бухарест, Румыния)
Europe/Budapest (Будапешт, Венгрия)
Europe/Chisinau
Europe/Copenhagen (Копенгаген, Дания)
Europe/Dublin (Дублин, Ирландия)
Europe/Gibraltar
Europe/Guernsey
Europe/Helsinki (Хельсинки, Финляндия)
Europe/Isle_of_Man
Europe/Istanbul (Стамбул, Турция)
Europe/Jersey
Europe/Kaliningrad (Калининград, Россия)
Europe/Kiev (Киев, Украина)
Europe/Lisbon (Лиссабон, Португалия)
Europe/Ljubljana (Любляна, Словения)
Europe/London (Лондон, Великобритания)
Europe/Luxembourg
Europe/Madrid (Мадрид, Испания)
Europe/Malta (Мальта, Мальта)
Europe/Mariehamn
Europe/Minsk (Минск, Беларусь)
Europe/Monaco
Europe/Moscow (Москва, Россия)
Europe/Nicosia (Никосия, Кипр)
Europe/Oslo (Осло, Норвегия)
Europe/Paris (Париж, Франция)
Europe/Podgorica
Europe/Prague (Прага, Чехия)
Europe/Riga (Рига, Латвия)
Europe/Rome (Рим, Италия)
Europe/Samara (Самара, Россия)
Europe/San_Marino
Europe/Sarajevo (Сараево, Босния и Герцеговина)
Europe/Simferopol
Europe/Skopje (Скопье, Македония)
Europe/Sofia (София, Болгария)
Europe/Stockholm
Europe/Tallinn (Таллин, Эстония)
Europe/Tirane
Europe/Tiraspol (Тирасполь, Молдова)
Europe/Uzhgorod (Ужгород, Украина)
Europe/Vaduz
Europe/Vatican
Europe/Vienna (Вена, Австрия)
Europe/Vilnius (Вильнюс, Литва)
Europe/Volgograd (Волгоград, Россия)
Europe/Warsaw (Варшава, Польша)
Europe/Zagreb (Загреб, Хорватия)
Europe/Zaporozhye (Запорожье, Украина)
Europe/Zurich (Цюрих, Швейцария)
Азия
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr (Анадырь, Россия)
Asia/Aqtau (Актау, Казахстан)
Asia/Aqtobe (Актобе, Казахстан)
Asia/Ashgabat
Asia/Ashkhabad (Ашхабад, Туркменистан)
Asia/Baghdad (Багдад, Ирак)
Asia/Bahrain
Asia/Baku (Баку, Азербайджан)
Asia/Bangkok
Asia/Beirut
Asia/Bishkek (Бишкек, Киргизия)
Asia/Brunei
Asia/Calcutta
Asia/Choibalsan
Asia/Chongqing
Asia/Chungking
Asia/Colombo
Asia/Dacca (Дакка, Бангладеш)
Asia/Damascus
Asia/Dhaka
Asia/Dili
Asia/Dubai
Asia/Dushanbe
Asia/Gaza
Asia/Harbin (Харбин, Китай)
Asia/Hebron
Asia/Ho_Chi_Minh
Asia/Hong_Kong (Гонконг, Китай)
Asia/Hovd
Asia/Irkutsk (Иркутск, Россия)
Asia/Istanbul
Asia/Jakarta (Джакарта, Индонезия)
Asia/Jayapura
Asia/Jerusalem
Asia/Kabul (Кабул, Афганистан)
Asia/Kamchatka
Asia/Karachi
Asia/Kashgar
Asia/Kathmandu
Asia/Katmandu
Asia/Khandyga
Asia/Kolkata
Asia/Krasnoyarsk
Asia/Kuala_Lumpur
Asia/Kuching
Asia/Kuwait
Asia/Macao
Asia/Macau
Asia/Magadan
Asia/Makassar
Asia/Manila
Asia/Muscat
Asia/Nicosia
Asia/Novokuznetsk (Новокузнецк, Россия)
Asia/Novosibirsk
Asia/Omsk (Омск, Россия)
Asia/Oral (Уральск, Казахстан)
Asia/Phnom_Penh
Asia/Pontianak
Asia/Pyongyang
Asia/Qatar
Asia/Qyzylorda
Asia/Rangoon
Asia/Riyadh
Asia/Saigon (Сайгон, Вьетнам)
Asia/Sakhalin (Сахалин, Россия)
Asia/Samarkand (Самарканд, Узбекистан)
Asia/Seoul (Сеул, Южная Корея)
Asia/Shanghai (Шанхай, Китай)
Asia/Singapore (Сингапур, Сингапур)
Asia/Taipei
Asia/Tashkent (Ташкент, Узбекистан)
Asia/Tbilisi (Тбилиси, Грузия)
Asia/Tehran
Asia/Tel_Aviv (Тель-Авив, Израиль)
Asia/Thimbu
Asia/Thimphu
Asia/Tokyo (Токио, Япония)
Asia/Ujung_Pandang
Asia/Ulaanbaatar
Asia/Ulan_Bator (Улан-Батор, Монголия)
Asia/Urumqi
Asia/Ust-Nera (Усть-Нера, Россия)
Asia/Vientiane (Вьетьян, Лаос)
Asia/Vladivostok (Владивосток, Россия)
Asia/Yakutsk (Якутск, Россия)
Asia/Yekaterinburg (Екатеринбург, Россия)
Asia/Yerevan (Ереван, Армения)
Различные часовые пояса PHP на одной странице
Введение
Часто возникает необходимость отобразить время разных часовых поясов на одной странице.
Например, на сайте HeiHei.ru это сделано для того, чтобы те, кто едет в Финляндию видели одновременно и финское и московское время.
Отвечает за это команда
В этой статье Вы узнаете о том как показать время сразу нескольких зон одновременно на одной странице.
Более простые примеры вы можете изучить в статье
Показать московское время
Если у вас время по умолчанию московское просто выведите его
Если время не московское, то его нужно сделать московским
За смену часового пояса отвечает функция date_default_timezone_set()
date_default_timezone_set (
‘Europe/Moscow’ );
echo (date(«H:i:s»));
Пример кода на PHP
Теперь разберём случай когда нужно показать время сразу нескольких поясов на одной странице.
‘; date_default_timezone_set ( ‘Europe/Helsinki’ ); echo ‘
‘; date_default_timezone_set ( ‘Europe/Stockholm’ ); echo ‘
‘; date_default_timezone_set ( ‘Europe/Moscow’ ); echo ‘
Результат
Московское время 06:41:56
Время в Хельсинки 06:41:56
Время в Стокгольме 05:41:56
Комментарии к коду
Получаем зону, которая стоит по умолчанию на сервере.
Выводим её. И думаем, нужна нам эта зона или нет.
В следующей строке переменной moscow_time присвоено значение сервеного времени.
Отобразили московское время.
Теперь нужно изменить временную зону
Присвоить переменной helsinki_time значение
В конце, на всякий случай сделаем время по умолчанию снова московским.
DateTimeImmutable: пример с ООП
Если вы немного знакомы с ООП, проще будет создать три объекта DateTimeImmutable и использовать их.
В Армении: 07:41:56
В Норвегии: 05:41:56
В Испании: 05:41:56
Как обновить время
PHP отдает время при загрузке и не может его менять на отданной странице.
button » value=» Обновить страницу 1 » onClick=» location.href=location.href «>
button » value=» Обновить страницу 2 » onClick=» window.location.href=window.location.href «>
Результат
Оба этих варианта могут испытывать (а могут и не испытывать) проблемы в случае когда Вы перешли внутри страницы по якорю.
В этом случае попробуйте
Обновить страницу 3
Обновить страницу 3
Время в разных поясаха в данный момент
Во Владивостоке | 13:41:56 |
В Токио | 12:41:56 |
В Новосибирске | 10:41:56 |
В Петербурге | 06:41:56 |
В Хельсинки | 06:41:56 |
В Стокгольме | 05:41:56 |
В Нью-Йорке | 23:41:56 |
В Лос-Анджелесе | 20:41:56 |
Список часовых поясов PHP
Указывать без пробелов между именами собственными и /
date_default_timezone_set
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
date_default_timezone_set — Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте
Описание
date_default_timezone_set() устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте.
Вместо использования этой функции, вы можете воспользоваться INI-настройкой date.timezone для установки часового пояса по умолчанию.
Список параметров
Возвращаемые значения
Примеры
Пример #1 Получение часового пояса по умолчанию
Смотрите также
User Contributed Notes 22 notes
// On many systems (Mac, for instance) «/etc/localtime» is a symlink
// to the file with the timezone info
if ( is_link ( «/etc/localtime» )) <
// If it is, that file’s name is actually the «Olsen» format timezone
$filename = readlink ( «/etc/localtime» );
Yes, I know it doesn’t work on Windows. Neither do I 🙂 Perhaps someone wants to add that functionality.
Hope this helps someone.
As Christopher Kramer said 9 years ago, not setting default timezone has performance impacts on PHP 5.6, and on PHP 7.1
It hasn’t on php 7.2 anymore.
As I set error_reporting to 0 in my script, it doesn’t seem linked to the fact it is logging the error.
I ran its benchmark script (modified) on Linux multiple times, alternating ‘on’ and ‘off’ setting :
This creates a huge problem for downloadable programs, which obviously cannot be hardcoded as this suggests, since the coder has no idea where they will be run.
Seems to me that if the server’s timezone cannot be relied on, then THAT is the the problem which needs fixed. Not, cause the coder’s syntactically-correct work to generate bogus error messages.
You should always turn on notices and have a customer error handler that converts notices or indeed any PHP message to exceptions.
I’ve been doing this for years and it looks like expanding the use of exceptions in PHP itself is an ongoing process. It’s almost certainly stuck with notices from legacy patterns prior to PHP possessing exception capability with the reason it’s not been thoroughly applied being BC breakage.
Similar for asserts, json, etc, etc it all to use exceptions.
Another note. I profiled my PHP script and it reported that calling this function took half the time. Anyone else got this? Is it really that expensive? Am I doubling init time not having it in php.ini and possibly setting to the timezone it’s already on? Or is it messing with time and breaking the time measurement? One day I’ll bother to wrap it in microtime to try to see.
After poundering and knocking my head on the table, I finally got a proper fix for Windows and PHP timezone handling.
Since Windows applies the DST to ActiveTimeBias in the registry, you only need this to apply.
The only problem is, that it cant use the timezone_set command.
You can request a response back in any date-format you wish, or use the default one given in the function itself.
If you want users to choose their own timezones, here’s some code that gets all available timezones but only uses one city for each possible value:
I experienced that using this function highly increases performance of functions like getdate() or date() using PHP 5.2.6 on Windows.
I experienced similar results on Linux servers with PHP 5.2.6 and 5.2.10, although the difference was not that significant on these servers: The PHP 5.2.10 server did run with date_default_timezone_set («only») twice as fast as without. The 5.2.6 server did 5 times faster with date_default_timezone_set. As you can see below, the 5.2.6-Windows machine did a LOT faster.
Of course these machines have completely different hardware and can not really be compared, but all show improved performance.
I checked PHP 4.4.9 on Windows (without date_default_timezone_set of course) and noticed that its as fast as PHP 5.2.6 with date_default_timezone_set.
The following script shows this:
# uncomment to see difference
# date_default_timezone_set(date_default_timezone_get());
// With date_default_timezone_set(): «Time: 0.379343986511»
// Without date_default_timezone_set(): «Time: 7.4971370697»
?>
Note that the timezone is not changed, it is only set again. I really wonder why this makes such a big performance difference, but its good to know.
I found a need to change the timezone based on a DB record, so it would display properly for each record. So I wrapped some of the other posts into this small class:
Note that there may be some unexpected side-effects that result from using either set_default_timezone() or the putenv(«TZ=. «) workalike for earlier PHP versions. ANY date formatted and output either by PHP or its apache host process will be unconditionally expressed in that timezone.
This does indeed include the web server’s logs and other output files and reports which by default usually do not include any indication of timezone. This has a further side-effect on log processing and analysis, obviously.
date() [function.date]: It is not safe to rely on the system’s timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘America/Los_Angeles’ for ‘PST/-8.0/no DST’ instead
Of course this is a problem that recently surfaced since PHP5. Quick fix is to set your time zone, add this line to your php code:
I was having major issues with the date.timezone setting after I updated from 5.3.3 to 5.4.29. I still need to update further, and perhaps it’s a bug in this version that will be fixed when I update..
«php_value date.timezone America/Denver»
And now the timezone is set in any directory I browse in. Very strange, and I still haven’t figured out why It wont work from the php.ini file. But here’s how to overcome the frustration.
This is a good script if you know or control your system so that you know that the local TZ in your OS is correct. Unfortunately, this script still creates an warning message under BSD UNIX.
To fix this, just add an «@» in front of «localtime» as:
Класс DateTimeZone
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
Введение
Представление часового пояса.
Обзор классов
Предопределённые константы
Часовые пояса Африки.
DateTimeZone::AMERICA
Часовые пояса Америки.
DateTimeZone::ANTARCTICA
Часовые пояса Антарктики.
DateTimeZone::ARCTIC
Часовые пояса Арктики.
DateTimeZone::ASIA
Часовые пояса Азии.
DateTimeZone::ATLANTIC
Часовые пояса Атлантики.
DateTimeZone::AUSTRALIA
Часовые пояса Австралии.
DateTimeZone::EUROPE
Часовые пояса Европы.
DateTimeZone::INDIAN
Часовые пояса Индии.
DateTimeZone::PACIFIC
Часовые пояса Тихого океана.
DateTimeZone::UTC
DateTimeZone::ALL
DateTimeZone::ALL_WITH_BC
Все часовые пояса, включая обратно совместимые.
DateTimeZone::PER_COUNTRY
Число часовых поясов на страну.
Содержание
User Contributed Notes 2 notes
Seems like a significant differences between php 5.3 and 5.6:
It seems like as of PHP 5.5, creating a new DateTimeZone with a string like ‘EDT’ will cause DateTimeZone::getName() to return ‘EDT’ whereas prior to 5.5 it would convert it would have returned ‘America/New_York’
This is of particular note when using a DateTimeZone object to change the timezone on a DateTime object. Using a DateTimeZone object when set as shown above will cause the conversion to be wrong without throwing any errors.