timezone_abbreviations_list()
Как использовать timezone_abbreviations_list() и DateTimeZone::listAbbreviations() в PHP для получения аббревиатур часовых поясов и IANA-идентификаторов.
Введение
Аббревиатура часового пояса — это короткий код из 2–5 букв, например EST, GMT или CEST, обозначающий смещение региона от Всемирного координированного времени (UTC). PHP может перечислить все известные ему аббревиатуры вместе с IANA-идентификаторами часовых поясов (например, America/New_York), которым они соответствуют.
В этой главе объясняется, как получить этот список, почему аббревиатуры сами по себе ненадёжны, и приводится справочная таблица распространённых кодов.
timezone_abbreviations_list() была устаревшей в PHP 8.1 и удалена в PHP 8.2. В PHP 8.2 и более поздних версиях используйте эквивалент DateTimeZone::listAbbreviations(). Обе функции возвращают одинаковую структуру данных.
Почему аббревиатуры неоднозначны
В отличие от IANA-идентификаторов, аббревиатуры не уникальны. CST может означать Central Standard Time (Северная Америка, UTC-6), China Standard Time (UTC+8) или Cuba Standard Time. BST — это British Summer Time или Bangladesh Standard Time. Поскольку один код может соответствовать нескольким регионам, никогда не следует хранить или настраивать часовой пояс по аббревиатуре. Всегда разрешайте её в IANA-идентификатор (например, Europe/London) и передавайте его в date_default_timezone_set() или объект DateTimeZone.
Именно для этого и предназначен список аббревиатур: превратить полученный код (например, из пользовательского ввода) в возможные идентификаторы, которым он может соответствовать — см. timezone_name_from_abbr() для выбора одного совпадения.
Перечисление всех аббревиатур
Обе функции возвращают ассоциативный массив. Каждый ключ — это аббревиатура в нижнем регистре; каждое значение — массив зон, где каждая зона имеет три поля:
dst—true, если запись является вариантом летнего времени.offset— смещение UTC в секундах.timezone_id— IANA-идентификатор (может бытьnullдля смещений без именованной зоны).
<?php
// PHP 8.2+ (use timezone_abbreviations_list() on older versions)
$abbreviations = DateTimeZone::listAbbreviations();
print_r($abbreviations['acst']);Вывод:
Array
(
[0] => Array
(
[dst] =>
[offset] => 34200
[timezone_id] => Australia/Adelaide
)
...
)Смещение 34200 секунд равно 34200 / 3600 = 9.5 часа, то есть UTC+9:30.
Преобразование аббревиатур в идентификаторы и смещения
Чтобы превратить исходную структуру в читаемые строки, переберите внешний массив, а затем каждую зону:
<?php
$abbreviations = DateTimeZone::listAbbreviations();
foreach ($abbreviations as $abbr => $zones) {
foreach ($zones as $zone) {
$hours = $zone['offset'] / 3600;
printf(
"%-5s => %-25s (UTC %+.1f)\n",
strtoupper($abbr),
$zone['timezone_id'] ?? '(unnamed)',
$hours
);
}
}Несколько примеров строк вывода:
GMT => Europe/London (UTC +0.0)
GMT => Africa/Abidjan (UTC +0.0)
CET => Europe/Paris (UTC +1.0)Список большой (тысячи строк), поэтому на практике его фильтруют по нужным кодам, а не выводят целиком.
Распространённые аббревиатуры часовых поясов
Ниже приведён справочный список распространённых аббревиатур часовых поясов (ключи массива в PHP — в нижнем регистре; здесь показаны в верхнем для удобства чтения):
- ACDT - Australian Central Daylight Time
- ACST - Australian Central Standard Time
- ACT - Acre Time
- ADT - Atlantic Daylight Time
- AEDT - Australian Eastern Daylight Time
- AEST - Australian Eastern Standard Time
- AFT - Afghanistan Time
- AKDT - Alaska Daylight Time
- AKST - Alaska Standard Time
- AMST - Amazon Summer Time
- AMT - Amazon Time
- ART - Argentina Time
- AST - Atlantic Standard Time
- AWST - Australian Western Standard Time
- AZOST - Azores Standard Time
- AZT - Azerbaijan Time
- BDT - Brunei Time
- BNT - Brunei Darussalam Time
- BOT - Bolivia Time
- BRST - Brasilia Summer Time
- BRT - Brasilia Time
- BST - British Summer Time
- BTT - Bhutan Time
- CAT - Central Africa Time
- CCT - Cocos Islands Time
- CDT - Central Daylight Time
- CEST - Central European Summer Time
- CET - Central European Time
- CHADT - Chatham Island Daylight Time
- CHAST - Chatham Island Standard Time
- CHOT - Choibalsan Standard Time
- CHST - Chamorro Standard Time
- CHT - Chuuk Time
- CKT - Cook Island Time
- CLST - Chile Summer Time
- CLT - Chile Standard Time
- COT - Colombia Time
- CST - Central Standard Time
- CT - Central Time
- CVT - Cape Verde Time
- CWST - Central Western Standard Time
- CXT - Christmas Island Time
- DAVT - Davis Time
- DDUT - Dumont-d'Urville Time
- EASST - Easter Island Summer Time
- EAST - Easter Island Standard Time
- EAT - Eastern Africa Time
- ECT - Eastern Caribbean Time
- EDT - Eastern Daylight Time
- EEST - Eastern European Summer Time
- EET - Eastern European Time
- EGST - Eastern Greenland Summer Time
- EGT - Eastern Greenland Time
- EIT - Eastern Indonesian Time
- EST - Eastern Standard Time
- FET - Further Eastern European Time
- FJT - Fiji Time
- FKST - Falkland Islands Summer Time
- FKT - Falkland Islands Time
- FNT - Fernando de Noronha Time
- GALT - Galapagos Time
- GAMT - Gambier Islands Time
- GET - Georgia Standard Time
- GFT - French Guiana Time
- GILT - Gilbert Island Time
- GIT - Gambier Island Time
- GMT - Greenwich Mean Time
- GST - Gulf Standard Time
- GYT - Guyana Time
- HADT - Hawaii-Aleutian Daylight Time
- HAST - Hawaii-Aleutian Standard Time
- HKT - Hong Kong Time
- HST - Hawaii Standard Time
- ICT - Indochina Time
- IDT - Israel Daylight Time
- IRDT - Iran Daylight Time
- IRST - Iran Standard Time
- IST - India / Irish / Israel Standard Time (ambiguous)
- JST - Japan Standard Time
- KST - Korea Standard Time
- MDT - Mountain Daylight Time
- MSK - Moscow Standard Time
- MST - Mountain Standard Time
- NZDT - New Zealand Daylight Time
- NZST - New Zealand Standard Time
- PDT - Pacific Daylight Time
- PHT - Philippine Time
- PKT - Pakistan Standard Time
- PST - Pacific Standard Time
- SGT - Singapore Time
- UTC - Coordinated Universal Time
- WAT - West Africa Time
- WEST - Western European Summer Time
- WET - Western European Time
- WIB - Western Indonesian Time
- WITA - Central Indonesian Time
Приведённый выше список является распространённым подмножеством. DateTimeZone::listAbbreviations() возвращает полный массив всех зарегистрированных аббревиатур, который следует перебирать программно (как показано выше), а не полагаться на поддерживаемый вручную список.
Связанные функции
- PHP Timezones — обзор
DateTimeZoneи IANA-идентификаторов. timezone_identifiers_list()— перечислить все IANA-идентификаторы, поддерживаемые PHP.timezone_name_from_abbr()— разрешить одну аббревиатуру в конкретный идентификатор.date_default_timezone_set()— установить часовой пояс по умолчанию для скрипта.