timezone_location_get()
PHP timezone_location_get() возвращает массив с кодом страны, широтой, долготой и комментариями для DateTimeZone. Синтаксис и примеры.
Функция PHP timezone_location_get()
Функция timezone_location_get() возвращает географическое местоположение, связанное с часовым поясом, — страну, широту и долготу. Это удобно, когда у вас есть часовой пояс (например, привязанный к аккаунту пользователя) и нужно узнать, где на Земле он находится, а не просто каково его смещение по времени.
На этой странице рассматриваются возвращаемые функцией данные, её синтаксис и параметры, запускаемые примеры, распространённые ловушки, а также связь с другими вспомогательными функциями для работы с часовыми поясами в PHP.
Синтаксис
<?php
timezone_location_get(DateTimeZone $object): array|falsetimezone_location_get() является процедурным псевдонимом метода DateTimeZone::getLocation(), поэтому $tz->getLocation() и timezone_location_get($tz) взаимозаменяемы.
Параметр
| Параметр | Тип | Описание |
|---|---|---|
$object | DateTimeZone | Обязательный. Объект DateTimeZone, местоположение которого нужно получить. |
Обратите внимание, что — в отличие от многих других функций работы с часовыми поясами — эта принимает объект DateTimeZone, а не строку. Чтобы создать объект из строки, используйте new DateTimeZone("Europe/London") или timezone_open().
Возвращаемое значение
При успехе функция возвращает ассоциативный массив со следующими ключами:
| Ключ | Описание |
|---|---|
country_code | Двухбуквенный код страны по ISO 3166 (например, GB), или ?? если неизвестно. |
latitude | Широта в десятичных градусах. |
longitude | Долгота в десятичных градусах. |
comments | Краткое примечание о местоположении; часто пустая строка. |
Возвращает false, если информация о местоположении недоступна для указанного часового пояса.
Примеры
Чтение местоположения часового пояса
Здесь мы создаём DateTimeZone для "Europe/London" и выводим данные о его местоположении:
Вывод:
Array
(
[country_code] => GB
[latitude] => 51.50833
[longitude] => -0.12528
[comments] =>
)Функция возвращает ассоциативный массив, описывающий, где закреплён часовой пояс. Обратите внимание, что comments пуст для многих зон — не рассчитывайте на его заполнение.
Использование объектно-ориентированного эквивалента
timezone_location_get($tz) — это просто псевдоним для DateTimeZone::getLocation(). Следующий код выводит тот же массив:
<?php
$timezone = new DateTimeZone("America/Los_Angeles");
print_r($timezone->getLocation());Вывод:
Array
(
[country_code] => US
[latitude] => 34.05222
[longitude] => -118.24278
[comments] => Pacific
)Вычисление расстояния между двумя часовыми поясами
Поскольку функция возвращает реальные координаты, с ними можно выполнять географические вычисления — например, расстояние по большому кругу (в километрах) между двумя зонами:
<?php
$a = timezone_location_get(new DateTimeZone("Europe/London"));
$b = timezone_location_get(new DateTimeZone("America/New_York"));
$earthRadius = 6371; // km
$dLat = deg2rad($b["latitude"] - $a["latitude"]);
$dLon = deg2rad($b["longitude"] - $a["longitude"]);
$h = sin($dLat / 2) ** 2
+ cos(deg2rad($a["latitude"])) * cos(deg2rad($b["latitude"]))
* sin($dLon / 2) ** 2;
$distance = 2 * $earthRadius * asin(sqrt($h));
echo round($distance) . " km";Вывод:
5570 kmРаспространённые ловушки
- Требуется объект, а не строка. Передача
"Europe/London"напрямую вызываетTypeError. Сначала оберните строку вnew DateTimeZone(...). commentsчасто пустой. Воспринимайте его как необязательные метаданные, а не метку для отображения пользователям.- Зоны только со смещением не имеют местоположения.
DateTimeZone, созданный из смещения вроде"+02:00", не привязан к месту, поэтому вызов возвращаетfalse. - Неверные идентификаторы дают ошибку сразу. В PHP 8.0+ создание
new DateTimeZone("Not/AZone")выбрасываетDateInvalidTimeZoneException(до этого —ValueError), поэтому ошибка возникает при конструировании объекта, а не вtimezone_location_get().
Связанные функции
timezone_open()— созданиеDateTimeZoneиз строки.timezone_name_get()— получение имени часового пояса.timezone_offset_get()— получение смещения UTC для часового пояса.timezone_identifiers_list()— список всех поддерживаемых идентификаторов часовых поясов.- PHP Timezones — обзор работы с часовыми поясами в PHP.
Заключение
timezone_location_get() превращает объект DateTimeZone в конкретные географические данные — код страны, широту и долготу, — которые можно использовать для картографии, вычисления расстояний или просто для того, чтобы показать пользователям, где находится часовой пояс. Не забывайте передавать объект DateTimeZone (а не строку) и обрабатывать возвращаемое значение false для зон, основанных только на смещении.