Временные зоны и часовые пояса в 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 ‘
Результат
Московское время 18:43:33
Время в Хельсинки 18:43:33
Время в Стокгольме 17:43:33
Комментарии к коду
Получаем зону, которая стоит по умолчанию на сервере.
Выводим её. И думаем, нужна нам эта зона или нет.
В следующей строке переменной moscow_time присвоено значение сервеного времени.
Отобразили московское время.
Теперь нужно изменить временную зону
Присвоить переменной helsinki_time значение
В конце, на всякий случай сделаем время по умолчанию снова московским.
DateTimeImmutable: пример с ООП
Если вы немного знакомы с ООП, проще будет создать три объекта DateTimeImmutable и использовать их.
В Армении: 19:43:33
В Норвегии: 17:43:33
В Испании: 17:43:33
Как обновить время
PHP отдает время при загрузке и не может его менять на отданной странице.
button » value=» Обновить страницу 1 » onClick=» location.href=location.href «>
button » value=» Обновить страницу 2 » onClick=» window.location.href=window.location.href «>
Результат
Оба этих варианта могут испытывать (а могут и не испытывать) проблемы в случае когда Вы перешли внутри страницы по якорю.
В этом случае попробуйте
Обновить страницу 3
Обновить страницу 3
Время в разных поясаха в данный момент
| Во Владивостоке | 01:43:33 |
| В Токио | 00:43:33 |
| В Новосибирске | 22:43:33 |
| В Петербурге | 18:43:33 |
| В Хельсинки | 18:43:33 |
| В Стокгольме | 17:43:33 |
| В Нью-Йорке | 11:43:33 |
| В Лос-Анджелесе | 08:43:33 |
Список часовых поясов PHP
Указывать без пробелов между именами собственными и /
Преобразование часовых поясов в php
может ли кто-нибудь предложить простой способ преобразования даты и времени в разные часовые пояса в php?
8 ответов
для этого можно использовать объект datetime или псевдонимы их функций:
редактировать комментарии
но я не могу использовать этот метод, потому что мне нужно показать дату в разных часовых поясах в качестве входа пользователя из разных мест
Это не проблема. Когда пользователь входит в систему, определить его часовой пояс и установить это для вашего объекта DateTime так же, как показано. Я использую аналогичный подход в одном из своих проектов, и он работает как шарм.
в базе данных мне нужно получить даты в любом часовом поясе, тогда только его можно обработать правильно
еще более простой способ выглядит так:
Как рассказали в руководстве по PHP, strtotime () также принимает часовой пояс, вам просто нужно добавить его к вашему datetime.
Я рекомендую вам хранить все ваши даты в UTC, потому что таким образом у вас не будет проблем с летнее время.
это работает для меня и это тоже довольно чисто!
ни один из этих ответов не работал для меня (я пропустил пробный код, который был слишком громоздким по размеру). Я также думаю, что странно изменять часовой пояс по умолчанию только для одного преобразования.
Итак, чтобы преобразовать в сервер по умолчанию, вы просто передадите один часовой пояс:
чтобы преобразовать сервер по умолчанию в пользователя, вы оставите 2-й параметр пустым или пустым:
и переключиться между часовые пояса, не связанные со значением по умолчанию, вы бы предоставили 2 часовых пояса:
Пользовательские часовые пояса
Как работать в одном приложении со множеством часовых поясов, которые выбирают сами пользователи, но при этом в базе данных все временные метки будут храниться в едином UTC-формате, либо в часовом поясе заданном по умолчанию в приложении, что позволит нам отображать одну и ту же информацию по-разному без нарушения ее целостности.
Часовые пояса в PHP и MySQL
Также его можно задать на системном уровне:
Все часовые пояса, которые поддерживает PHP, можно увидеть здесь.
Также можно задать глобальную переменную:
Если мы используем PDO, то можем задать часовой пояс для каждого соединения, указая GMT-разницу:
Часовые пояса в Laravel
Если ваше приложение будет использоваться пользователями с разными часовыми поясами, то рекомендуется использовать UTC в качестве общесистемного часового пояса, чтобы все даты и временные метки хранились в базе данных как UTC, независимо от часового пояса пользователя (тем более, что он может измениться, например, если пользователь путешествует и зашел из другой страны), а затем конвертировать временные метки в часовой пояс пользователя, чтобы он видел их правильно.
Существуют разные подходы к решению этой проблемы, в этой статье мы попытаемся охватить различные глобальные параметры, чтобы пользователь мог задать свой часовой пояс и увидеть дату и время в соответствии со своими предпочтениями.
Поле timezone в таблице пользователей
Поскольку каждый пользователь может задать свой часовой пояс, то нам нужно дополнительное поле в таблице пользователей для хранения этой информации.
Добавление Аксессора и Мутатора для часового пояса
Поскольку, при этом подходе, поле часового пояса может быть нулевым (например, если оно равно системному часовому поясу, или если мы добавляем эту функцию в уже существующую систему, где у пользователей пока нет часового пояса), то сделаем аксессор, который, если часовой пояс пользователя пуст, выдает дефолтный часовой пояс.
В пользовательской модели зададим:
Так как мы не будем хранить в базе данных часовые пояса аналогичные дефолтному, то добавим Мутатор, который, если часовой пояс, выбранный пользователем, равен дефолтному, то он не будет сохранен в базе данных.
Хелпер Timezone
Напишем несколько хелперов, которые можно будет использовать многократно.
Существует много способов подключения хелперов, например создать app/Helpers/Helpers.php со следующей структурой:
И добавить в файл composer.json ссылку на него:
В Helpers.php добавим два новых хелпера для часовых поясов:
Этот метод создаст упорядоченную коллекцию с доступными часовыми поясами (используемыми в качестве ключа) вместе со смещением по Гринвичу, как показано на изображении ниже. Поскольку эта информация не будет меняться, то мы бессрочно закэшируем её.
Выбор часового пояса пользователем
Используя ранее созданный хелпер, добавим форму, в которой пользователь может задавать свой часовой пояс. Например:
Получение часового пояса пользователя
Либо можно получить эту информацию и без использования внешних библиотек, но такой код может не заработать на старых браузерах:
Использование часового пояса пользователя в контроллерах и blade-шаблонах
Существуют различные варианты преобразования дат и временных меток с использованием часового пояса пользователя.
Если раздел требует, чтобы пользователь был авторизован, то мы можем использовать, например:
Или хелпер, чтобы учесть неавторизованные случаи и возвращать дефолтный часовой пояс:
Чтобы отпарсить временную метку с использованием часового пояса пользователя:
Сохранение временных меток в базе данных в формате UTC
Обычно пользователь добавляет временные метки, выбирая дату и время из javascript-библиотеки, используя свой собственный часовой пояс, поэтому мы должны преобразовать эту дату в UTC, чтобы сохранить ее в нашей базе данных.
Предположим, что пользователь может добавлять элементы и задавать их дату создания, а часовой пояс отличается от дефолтного часового пояса. Один из способов преобразования такой даты перед сохранением:
Таким образом, мы указываем парсеру, что часовой пояс данной временной метки имеет тип, и что мы преобразуем его в UTC или дефолтный часовой пояс нашего приложения.
Важно, чтобы это преобразование выполнялось после валидации, поскольку в противном случае, если проверка не удалась, то при вызове old() в шаблоне, пользователь увидит дату в формате UTC, а не в своем часовом поясе.
Пользователь имеет возможность редактировать этот элемент, поэтому сделаем, чтобы он отображался в его часовом поясе — преобразуем его перед отправкой в шаблон:
Аксессоры часового пояса пользовательской модели
Если мы хотим, чтобы временные метки времени по умолчанию возвращались в часовом поясе пользователя (или дефолтном, если пользователь не залогинен или не установил свой часовой пояс), то можна задать аксессоры в модели.
Blade-компонент для дат с часовым поясом пользователя
Чтобы упростить преобразование временных меток с часовым поясом пользователя в Blade, мы можем создать отдельный компонент.
Нерекомендуемый подход
Этого делать не рекомендуется, поскольку таким образом часовой пояс всей системы изменяется для каждого пользователя и в базе данных будут сохраняться временные метки с разными часовыми поясами.
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
Время в PHP, смещение от GMT, UTC
Для начала разберемся что такое GMT и UTC. Во многих источниках они упоминаются как синонимы, и между ними действительно не существенная разница (до 1 секунды).
Их отличие в методике получения точного значения. UTC (универсальное координированное время) измеряется благодаря высокоточным атомным часам. GMT (Время гринвичского или нулевого меридиана) получают благодаря астрономическим расчетам. При этом UTC периодически подгоняют, чтобы расхождение с GMT составляло не более секунды.
Для бытовых целей это расхождение не важно и потому UTC и GMT можно использовать как одно и тоже число.
Время, используемое в PHP
Речь идет о функции time(). Она возвращает так называемый UNIX_TIMESTAMP, время в секундах с 1 Января 1970 года.
Какое время возвращает PHP «по умолчанию»? Для какого часового пояса? Установка по умолчанию часового пояса выполняется в файле php.ini. Например, здесь установлен часовой пояс Лос Анджелеса:
Но если настройки не менялись после установки PHP, то обычно вы там обнаружите UTC, что соответствует часовому поясу GMT:
В программе, вы можете установить нужный вам часовой пояс.
Это можно сделать вот так:
Если используется второй способ, то он устанавливает приоритетное значение часового пояса для функций времени в PHP.
Функция time(), показывает время именно для того часового пояса, который установлен в текущий момент в настройках или date_default_timezone_set().
Как узнать разницу времени между локальным часовым поясом и GMT?
Мы разобрались, что time() показывает время для выбранного часового пояса. Разницу времени локального времени (LT) от GMT и текущий код часового пояса можно получить с помощью ключей функции date(). Рассмотрим следующий пример.
Z — разницу в секундах, при этом пояса западнее GMT дают отрицательные значения, а восточнее — положительные;
e — идентификатор часового пояса (появился в PHP 5.1);
P — разница с GMT в часах и минутах (появился в PHP 5.1.3),
T — аббревиатура часового пояса.
Есть и другие ключи, все они перечислены в документации функции date().
Кстати, через 22 года (19 января 2038) для хранения времени в таком формате уже не будет хватать 32 битного целого числа со знаком. Вполне возможно, что 32 битных приложений уже к тому времени не останется, так что проблемы переполнения не возникнет. 64х-битной переменной уже должно хватить на 292 млрд. лет. Можно уже сейчас проектировать базы данных с учетом этого факта.
Данная запись опубликована в 14.01.2016 19:51 и размещена в PHP. Вы можете перейти в конец страницы и оставить ваш комментарий.

