W3docs

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() для выбора одного совпадения.

Перечисление всех аббревиатур

Обе функции возвращают ассоциативный массив. Каждый ключ — это аббревиатура в нижнем регистре; каждое значение — массив зон, где каждая зона имеет три поля:

  • dsttrue, если запись является вариантом летнего времени.
  • 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() — установить часовой пояс по умолчанию для скрипта.

Практика

Практика
Какие из следующих являются допустимыми аббревиатурами часовых поясов согласно списку аббревиатур часовых поясов PHP на W3docs?
Какие из следующих являются допустимыми аббревиатурами часовых поясов согласно списку аббревиатур часовых поясов PHP на W3docs?
Was this page helpful?