Skip to content

Cтандартизация выбора таймзоны component or func #2649

@dsedinkin

Description

@dsedinkin

Description

Сейчас в экосистеме gravity-ui нет единого формата таймзон, из-за чего каждая команда реализует выбор и отображение по-своему (и на клиенте, и на backend). Это приводит к расхождениям, особенно с учётом DST и локализации.

Также это вопрос бренда gravity-ui, стандартного восприятия выбора таймзоны пользователями сайтов/web-приложений на gravity-ui.

Windows:

Image

Профиль яндекс:

Image

Предлагаю использовать стандартный объект:

type TimezoneOption = {
  value: string; // IANA, например "Europe/Moscow"
  label: string; // "(UTC+03:00) Москва"
  offset: string; // вычисляемый через Intl (DST-aware)
}

Ключевые принципы:

  • Использовать IANA (Europe/...) как единственный источник истины
  • Вычислять offset динамически через Intl (с учётом DST)
  • Генерировать label на клиенте с учётом локали пользователя
  • Не полагаться на статические JSON (они устаревают и не учитывают DST)

Пример получения offset:

const getOffset = (tz) => {
  const date = new Date();

  const parts = new Intl.DateTimeFormat('en-GB', {
    timeZone: tz,
    hour: '2-digit',
    minute: '2-digit',
    timeZoneName: 'longOffset'
  }).formatToParts(date);

  return parts.find(p => p.type === 'timeZoneName')?.value; 
  // "GMT+03:00"
}

Используем полифил для поддержки для старых браузеров, Intl.DisplayNames, на всякий случай:

npm install @formatjs/intl-displaynames

Я в своей реализации UI использую компонент Select c filterable true.

Сразу возвращать json типовой не представляется возможным, так как он не будет учитывать локализацию и «летнее время».

Вот такой json например, генерируется в яндекс профиле, посмотрев на него ты видишь стандартизированную и понятную структуру.

[
    {
        "code": "Pacific/Niue",
        "name": "(UTC-11:00) Алофи"
    },
    {
        "code": "Pacific/Pago_Pago",
        "name": "(UTC-11:00) Паго-Паго"
    },
    {
        "code": "Pacific/Honolulu",
        "name": "(UTC-10:00) Гонолулу, Хило, Милилани"
    },
    {
        "code": "Pacific/Rarotonga",
        "name": "(UTC-10:00) Аваруа, Аитутаки"
    },
    {
        "code": "Pacific/Tahiti",
        "name": "(UTC-10:00) Папеэте, Хуахине, Маупити"
    },
    {
        "code": "Pacific/Marquesas",
        "name": "(UTC-09:30) Нуку Хива"
    },
    {
        "code": "America/Anchorage",
        "name": "(UTC-08:00) Анкоридж, Фэрбанкс, Ситка"
    },
    {
        "code": "America/Juneau",
        "name": "(UTC-08:00) Джуно, Кетчикан"
    },
    {
        "code": "America/Dawson",
        "name": "(UTC-07:00) Доусон"
    },
    {
        "code": "America/Dawson_Creek",
        "name": "(UTC-07:00) Форт-Сент-Джон, Кранбрук, Досон-Крик"
    },
    {
        "code": "America/Hermosillo",
        "name": "(UTC-07:00) Эрмосильо, Сьюдад-Обрегон, Ногалес"
    },
    {
        "code": "America/Los_Angeles",
        "name": "(UTC-07:00) Сан-Франциско, Лос-Анджелес, Сан-Диего"
    },
    {
        "code": "America/Phoenix",
        "name": "(UTC-07:00) Финикс, Тусон, Меса"
    },
    {
        "code": "America/Tijuana",
        "name": "(UTC-07:00) Тихуана, Мехикали, Энсенада"
    },
    {
        "code": "America/Vancouver",
        "name": "(UTC-07:00) Ванкувер, Суррей, Бернаби"
    },
    {
        "code": "America/Whitehorse",
        "name": "(UTC-07:00) Уайтхорс"
    },
    {
        "code": "America/Belize",
        "name": "(UTC-06:00) Белиз, Сан-Игнасио, Бельмопан"
    },
    {
        "code": "America/Boise",
        "name": "(UTC-06:00) Бойсе, Меридиан, Айдахо-Фолс"
    },
    {
        "code": "America/Chihuahua",
        "name": "(UTC-06:00) Чиуауа, Кульякан, Масатлан"
    },
    {
        "code": "America/Ciudad_Juarez",
        "name": "(UTC-06:00) Сьюдад-Хуарес"
    },
    {
        "code": "America/Costa_Rica",
        "name": "(UTC-06:00) Сан-Хосе, Картаго, Лимон"
    },
    {
        "code": "America/Denver",
        "name": "(UTC-06:00) Денвер, Альбукерке, Колорадо-Спрингс"
    },
    {
        "code": "America/Edmonton",
        "name": "(UTC-06:00) Калгари, Эдмонтон, Ред Дир"
    },
    {
        "code": "America/Guatemala",
        "name": "(UTC-06:00) Гватемала, Сан-Сальвадор, Кесальтенанго"
    },
    {
        "code": "America/Managua",
        "name": "(UTC-06:00) Манагуа, Матагальпа, Леон"
    },
    {
        "code": "America/Merida",
        "name": "(UTC-06:00) Мерида, Чичен-Ица"
    },
    {
        "code": "America/Mexico_City",
        "name": "(UTC-06:00) Мехико, Гвадалахара, Леон"
    },
    {
        "code": "America/Monterrey",
        "name": "(UTC-06:00) Монтеррей, Сан-Педро-Гарса-Гарсия"
    },
    {
        "code": "America/Regina",
        "name": "(UTC-06:00) Мус-Джо, Свифт-Керрент, Йорктон"
    },
    {
        "code": "America/Swift_Current",
        "name": "(UTC-06:00) Саскатун, Реджайна, Принс-Альберт"
    },
    {
        "code": "America/Tegucigalpa",
        "name": "(UTC-06:00) Сан-Педро-Сула, Тегусигальпа, Ла-Сейба"
    },
    {
        "code": "America/Yellowknife",
        "name": "(UTC-06:00) Йеллоунайф, Хей-Ривер, Инувик"
    },
    {
        "code": "Pacific/Easter",
        "name": "(UTC-06:00) Ханга-Роа"
    },
    {
        "code": "Pacific/Galapagos",
        "name": "(UTC-06:00) Пуэрто Айора, Пуэрто-Бакерисо-Морено, Бальтра"
    },
    {
        "code": "America/Atikokan",
        "name": "(UTC-05:00) Кенора, Драйден, Ред-Лейк"
    },
    {
        "code": "America/Bogota",
        "name": "(UTC-05:00) Богота, Медельин, Кали"
    },
    {
        "code": "America/Cancun",
        "name": "(UTC-05:00) Канкун, Четумаль, Плайя-дель-Кармен"
    },
    {
        "code": "America/Cayman",
        "name": "(UTC-05:00) Джорджтаун, Кайман-Брак"
    },
    {
        "code": "America/Chicago",
        "name": "(UTC-05:00) Чикаго, Эль-Пасо, Нашвилл"
    },
    {
        "code": "America/Guayaquil",
        "name": "(UTC-05:00) Гуаякиль, Кито, Куэнка"
    },
    {
        "code": "America/Indiana/Knox",
        "name": "(UTC-05:00) Эвансвилл, Мичиган Сити, Вальпараисо"
    },
    {
        "code": "America/Jamaica",
        "name": "(UTC-05:00) Кингстон, Монтего-Бей, Мей Пен"
    },
    {
        "code": "America/Lima",
        "name": "(UTC-05:00) Лима, Панама, Трухильо"
    },
    {
        "code": "America/Matamoros",
        "name": "(UTC-05:00) Рейноса, Нуэво-Ларедо, Сьюдад-Акунья"
    },
    {
        "code": "America/Menominee",
        "name": "(UTC-05:00) Мемфис, Джексон, Кливленд"
    },
    {
        "code": "America/North_Dakota/Center",
        "name": "(UTC-05:00) Хьюстон, Сан-Антонио, Даллас"
    },
    {
        "code": "America/Rio_Branco",
        "name": "(UTC-05:00) Риу-Бранку, Табатинга"
    },
    {
        "code": "America/Winnipeg",
        "name": "(UTC-05:00) Виннипег, Брандон, Томпсон"
    },
    {
        "code": "America/Anguilla",
        "name": "(UTC-04:00) Валли"
    },
    {
        "code": "America/Antigua",
        "name": "(UTC-04:00) Сент-Джонс"
    },
    {
        "code": "America/Aruba",
        "name": "(UTC-04:00) Ораньестад, Ноорд, Пальм Бич"
    },
    {
        "code": "America/Asuncion",
        "name": "(UTC-04:00) Асунсьон, Сьюдад-дель-Эсте, Энкарнасьон"
    },
    {
        "code": "America/Barbados",
        "name": "(UTC-04:00) Бриджтаун"
    },
    {
        "code": "America/Campo_Grande",
        "name": "(UTC-04:00) Кампу-Гранди, Дорадус, Корумба"
    },
    {
        "code": "America/Caracas",
        "name": "(UTC-04:00) Каракас, Валенсия, Маракай"
    },
    {
        "code": "America/Cuiaba",
        "name": "(UTC-04:00) Куяба, Варзеа-Гранди, Рондонополис"
    },
    {
        "code": "America/Curacao",
        "name": "(UTC-04:00) Виллемстад, Филипсбург, Гран-Каса"
    },
    {
        "code": "America/Detroit",
        "name": "(UTC-04:00) Детройт, Гранд-Рапидс, Уоррен"
    },
    {
        "code": "America/Dominica",
        "name": "(UTC-04:00) Фор-де-Франс, Кастри, Грос Ислет"
    },
    {
        "code": "America/Grand_Turk",
        "name": "(UTC-04:00) Коберн-Таун"
    },
    {
        "code": "America/Grenada",
        "name": "(UTC-04:00) Сент-Джорджес"
    },
    {
        "code": "America/Guadeloupe",
        "name": "(UTC-04:00) Ле-Гозье, Пуант-а-Питр, Сент-Франсуа"
    },
    {
        "code": "America/Guyana",
        "name": "(UTC-04:00) Джорджтаун, Нью-Амстердам"
    },
    {
        "code": "America/Havana",
        "name": "(UTC-04:00) Гавана, Тринидад, Сантьяго-де-Куба"
    },
    {
        "code": "America/Indiana/Marengo",
        "name": "(UTC-04:00) Индианаполис, Кармел, Кокомо"
    },
    {
        "code": "America/Indiana/Vevay",
        "name": "(UTC-04:00) Форт-Уэйн, Терр Хот"
    },
    {
        "code": "America/Indianapolis",
        "name": "(UTC-04:00) Саут-Бенд, Блумингтон, Мунчи"
    },
    {
        "code": "America/Iqaluit",
        "name": "(UTC-04:00) Икалуит"
    },
    {
        "code": "America/Kentucky/Monticello",
        "name": "(UTC-04:00) Атланта"
    },
    {
        "code": "America/Kralendijk",
        "name": "(UTC-04:00) Кралендейк"
    },
    {
        "code": "America/La_Paz",
        "name": "(UTC-04:00) Санта-Крус-де-ла-Сьерра, Эль-Альто, Кочабамба"
    },
    {
        "code": "America/Louisville",
        "name": "(UTC-04:00) Колумбус, Луисвилл, Лексингтон"
    },
    {
        "code": "America/Manaus",
        "name": "(UTC-04:00) Манаус, Боа-Виста, Паринтинс"
    },
    {
        "code": "America/Montreal",
        "name": "(UTC-04:00) Квебек, Монреаль, Лаваль"
    },
    {
        "code": "America/Montserrat",
        "name": "(UTC-04:00) Плимут"
    },
    {
        "code": "America/Nassau",
        "name": "(UTC-04:00) Нассау, Фрипорт, Джордж Таун"
    },
    {
        "code": "America/New_York",
        "name": "(UTC-04:00) Нью-Йорк, Цицеро, Филадельфия"
    },
    {
        "code": "America/Port-au-Prince",
        "name": "(UTC-04:00) Порт-о-Пренс, Гонаив, Кап-Аитьен"
    },
    {
        "code": "America/Port_of_Spain",
        "name": "(UTC-04:00) Порт-оф-Спейн"
    },
    {
        "code": "America/Porto_Velho",
        "name": "(UTC-04:00) Порту-Велью, Жи-Парана, Вильена"
    },
    {
        "code": "America/Puerto_Rico",
        "name": "(UTC-04:00) Сан-Хуан, Каролина, Понсе"
    },
    {
        "code": "America/Santiago",
        "name": "(UTC-04:00) Сантьяго, Антофагаста, Винья-дель-Мар"
    },
    {
        "code": "America/Santo_Domingo",
        "name": "(UTC-04:00) Санто-Доминго, Сантьяго-де-лос-Кабальерос, Санто-Доминго-Есте"
    },
    {
        "code": "America/St_Barthelemy",
        "name": "(UTC-04:00) Густавия"
    },
    {
        "code": "America/St_Kitts",
        "name": "(UTC-04:00) Бастер"
    },
    {
        "code": "America/St_Thomas",
        "name": "(UTC-04:00) Шарлотта-Амалия"
    },
    {
        "code": "America/St_Vincent",
        "name": "(UTC-04:00) Кингстаун"
    },
    {
        "code": "America/Thunder_Bay",
        "name": "(UTC-04:00) Тандер-Бей"
    },
    {
        "code": "America/Toronto",
        "name": "(UTC-04:00) Торонто, Оттава, Миссиссага"
    },
    {
        "code": "America/Tortola",
        "name": "(UTC-04:00) Род-Таун, Кристианстед"
    },
    {
        "code": "America/Argentina/Buenos_Aires",
        "name": "(UTC-03:00) Буэнос-Айрес, Кордова, Росарио"
    },
    {
        "code": "America/Belem",
        "name": "(UTC-03:00) Белен, Ананиндеуа, Сантарен"
    },
    {
        "code": "America/Cayenne",
        "name": "(UTC-03:00) Парамарибо, Кайенна"
    },
    {
        "code": "America/Fortaleza",
        "name": "(UTC-03:00) Форталеза, Аракажу, Каукая"
    },
    {
        "code": "America/Goose_Bay",
        "name": "(UTC-03:00) Хеппи-Валли-Гуз-Бэй, Вабуш, Нейн"
    },
    {
        "code": "America/Halifax",
        "name": "(UTC-03:00) Галифакс, Сент-Джон, Дартмут"
    },
    {
        "code": "America/Maceio",
        "name": "(UTC-03:00) Салвадор, Масейо, Натал"
    },
    {
        "code": "America/Montevideo",
        "name": "(UTC-03:00) Монтевидео, Сальто, Пайсанду"
    },
    {
        "code": "America/Recife",
        "name": "(UTC-03:00) Ресифи, Терезина, Жабоатан-дус-Гуарарапес"
    },
    {
        "code": "America/Santarem",
        "name": "(UTC-03:00) Сан-Луис, Жуан-Песоа, Кампина-Гранди"
    },
    {
        "code": "America/Sao_Paulo",
        "name": "(UTC-03:00) Сан-Паулу, Рио-де-Жанейро, Бразилиа"
    },
    {
        "code": "Atlantic/Bermuda",
        "name": "(UTC-03:00) Сент-Джордж, Гамильтон"
    },
    {
        "code": "America/St_Johns",
        "name": "(UTC-02:30) Сент-Джонс, Корнер-Брук, Гандер"
    },
    {
        "code": "America/Noronha",
        "name": "(UTC-02:00) Фернанду-ди-Норонья"
    },
    {
        "code": "Atlantic/South_Georgia",
        "name": "(UTC-02:00) Грютвикен"
    },
    {
        "code": "America/Godthab",
        "name": "(UTC-01:00) Нуук, Какорток, Маниитсок"
    },
    {
        "code": "Atlantic/Cape_Verde",
        "name": "(UTC-01:00) Прая, Сан-Филип, Минделу"
    },
    {
        "code": "Africa/Abidjan",
        "name": "(UTC+00:00) Абиджан, Буаке, Корого"
    },
    {
        "code": "Africa/Accra",
        "name": "(UTC+00:00) Аккра, Кумаси, Тамале"
    },
    {
        "code": "Africa/Bamako",
        "name": "(UTC+00:00) Бамако, Уагадугу, Бобо-Диуласо"
    },
    {
        "code": "Africa/Banjul",
        "name": "(UTC+00:00) Банжул, Фарафенни"
    },
    {
        "code": "Africa/Bissau",
        "name": "(UTC+00:00) Бисау, Сан-Домингус, Бафата"
    },
    {
        "code": "Africa/Conakry",
        "name": "(UTC+00:00) Конакри, Канкан, Лабе"
    },
    {
        "code": "Africa/Dakar",
        "name": "(UTC+00:00) Дакар, Тиес, Мбур"
    },
    {
        "code": "Africa/Freetown",
        "name": "(UTC+00:00) Фритаун, Бо, Макени"
    },
    {
        "code": "Africa/Lome",
        "name": "(UTC+00:00) Ломе, Кара, Кпалиме"
    },
    {
        "code": "Africa/Monrovia",
        "name": "(UTC+00:00) Монровия"
    },
    {
        "code": "Africa/Nouakchott",
        "name": "(UTC+00:00) Нуакшот, Нуадибу, Росо"
    },
    {
        "code": "Africa/Sao_Tome",
        "name": "(UTC+00:00) Сан-Томе"
    },
    {
        "code": "Atlantic/Azores",
        "name": "(UTC+00:00) Орта"
    },
    {
        "code": "Atlantic/Reykjavik",
        "name": "(UTC+00:00) Рейкьявик, Вестманнаэйяр"
    },
    {
        "code": "Africa/Algiers",
        "name": "(UTC+01:00) Алжир, Оран, Константина"
    },
    {
        "code": "Africa/Bangui",
        "name": "(UTC+01:00) Банги, Бамбари, Нола"
    },
    {
        "code": "Africa/Brazzaville",
        "name": "(UTC+01:00) Браззавиль, Пуэнт-Нуар, Долизи"
    },
    {
        "code": "Africa/Casablanca",
        "name": "(UTC+01:00) Касабланка, Фес, Рабат"
    },
    {
        "code": "Africa/Douala",
        "name": "(UTC+01:00) Дуала, Яунде, Баменда"
    },
    {
        "code": "Africa/El_Aaiun",
        "name": "(UTC+01:00) Эль-Аюн, Бир-Лелу"
    },
    {
        "code": "Africa/Kinshasa",
        "name": "(UTC+01:00) Киншаса, Луанда, Мбужи-Майи"
    },
    {
        "code": "Africa/Lagos",
        "name": "(UTC+01:00) Лагос, Кано, Ибадан"
    },
    {
        "code": "Africa/Libreville",
        "name": "(UTC+01:00) Либревиль, Порт-Жантиль, Гамба"
    },
    {
        "code": "Africa/Malabo",
        "name": "(UTC+01:00) Бата, Малабо"
    },
    {
        "code": "Africa/Ndjamena",
        "name": "(UTC+01:00) Нджамена, Абеше, Файя-Ларжо"
    },
    {
        "code": "Africa/Niamey",
        "name": "(UTC+01:00) Ниамей, Зиндер, Тахуа"
    },
    {
        "code": "Africa/Porto-Novo",
        "name": "(UTC+01:00) Котону, Джугу, Порто-Ново"
    },
    {
        "code": "Africa/Tunis",
        "name": "(UTC+01:00) Тунис, Сфакс, Бизерта"
    },
    {
        "code": "Atlantic/Canary",
        "name": "(UTC+01:00) Лас-Пальмас-де-Гран-Канария, Санта-Крус-де-Тенерифе, Арона"
    },
    {
        "code": "Atlantic/Faeroe",
        "name": "(UTC+01:00) Киркьюбур"
    },
    {
        "code": "Europe/Dublin",
        "name": "(UTC+01:00) Дублин, Свордс, Дроэда"
    },
    {
        "code": "Europe/Lisbon",
        "name": "(UTC+01:00) Лиссабон, Вила-Нова-ди-Гая, Матозиньюш"
    },
    {
        "code": "Europe/London",
        "name": "(UTC+01:00) Лондон, Бирмингем, Лидс"
    },
    {
        "code": "Africa/Bujumbura",
        "name": "(UTC+02:00) Бужумбура"
    },
    {
        "code": "Africa/Cairo",
        "name": "(UTC+02:00) Каир, Александрия, Гиза"
    },
    {
        "code": "Africa/Gaborone",
        "name": "(UTC+02:00) Габороне, Франсистаун, Молепололе"
    },
    {
        "code": "Africa/Harare",
        "name": "(UTC+02:00) Булавайо, Хараре, Гверу"
    },
    {
        "code": "Africa/Johannesburg",
        "name": "(UTC+02:00) Йоханнесбург, Кейптаун, Претория"
    },
    {
        "code": "Africa/Khartoum",
        "name": "(UTC+02:00) Омдурман, Хартум, Ньяла"
    },
    {
        "code": "Africa/Kigali",
        "name": "(UTC+02:00) Кигали"
    },
    {
        "code": "Africa/Lusaka",
        "name": "(UTC+02:00) Лусака, Лилонгве, Блантайр"
    },
    {
        "code": "Africa/Maputo",
        "name": "(UTC+02:00) Мапуту, Матола, Нампула"
    },
    {
        "code": "Africa/Maseru",
        "name": "(UTC+02:00) Масеру"
    },
    {
        "code": "Africa/Mbabane",
        "name": "(UTC+02:00) Мбабане, Манзини"
    },
    {
        "code": "Africa/Tripoli",
        "name": "(UTC+02:00) Триполи, Бенгази, Адждабия"
    },
    {
        "code": "Africa/Windhoek",
        "name": "(UTC+02:00) Виндхук, Уолфиш-Бей, Рунду"
    },
    {
        "code": "Europe/Amsterdam",
        "name": "(UTC+02:00) Амстердам, Тилбург, Алмере"
    },
    {
        "code": "Europe/Andorra",
        "name": "(UTC+02:00) Андорра-ла-Велья, Сант-Жулиа-де-Лория, Энкам"
    },
    {
        "code": "Europe/Belgrade",
        "name": "(UTC+02:00) Белград, Подгорица, Лесковац"
    },
    {
        "code": "Europe/Berlin",
        "name": "(UTC+02:00) Берлин, Гамбург, Мюнхен"
    },
    {
        "code": "Europe/Bratislava",
        "name": "(UTC+02:00) Братислава, Липтовски-Микулаш, Кошице"
    },
    {
        "code": "Europe/Brussels",
        "name": "(UTC+02:00) Шарлеруа, Брюссель, Алст"
    },
    {
        "code": "Europe/Budapest",
        "name": "(UTC+02:00) Будапешт, Шопрон, Хайдусобосло"
    },
    {
        "code": "Europe/Copenhagen",
        "name": "(UTC+02:00) Копенгаген, Эсбьерг, Раннерс"
    },
    {
        "code": "Europe/Gibraltar",
        "name": "(UTC+02:00) Гибралтар"
    },
    {
        "code": "Europe/Kaliningrad",
        "name": "(UTC+02:00) Калининград, Советск, Черняховск"
    },
    {
        "code": "Europe/Ljubljana",
        "name": "(UTC+02:00) Любляна, Марибор, Крань"
    },
    {
        "code": "Europe/Luxembourg",
        "name": "(UTC+02:00) Люксембург, Дикирх, Гревенмахер"
    },
    {
        "code": "Europe/Madrid",
        "name": "(UTC+02:00) Мадрид, Барселона, Валенсия"
    },
    {
        "code": "Europe/Malta",
        "name": "(UTC+02:00) Сент-Полс-Бэй, Меллиеха, Валлетта"
    },
    {
        "code": "Europe/Monaco",
        "name": "(UTC+02:00) Монако, Монте-Карло"
    },
    {
        "code": "Europe/Oslo",
        "name": "(UTC+02:00) Осло, Саннес, Олесунн"
    },
    {
        "code": "Europe/Paris",
        "name": "(UTC+02:00) Париж, Марсель, Лион"
    },
    {
        "code": "Europe/Prague",
        "name": "(UTC+02:00) Прага, Йиглава, Байё"
    },
    {
        "code": "Europe/Rome",
        "name": "(UTC+02:00) Рим, Милан, Неаполь"
    },
    {
        "code": "Europe/San_Marino",
        "name": "(UTC+02:00) Сан-Марино, Аккуавива"
    },
    {
        "code": "Europe/Sarajevo",
        "name": "(UTC+02:00) Сараево, Ливно"
    },
    {
        "code": "Europe/Skopje",
        "name": "(UTC+02:00) Скопье, Зеница, Мостар"
    },
    {
        "code": "Europe/Stockholm",
        "name": "(UTC+02:00) Стокгольм, Лунд, Бурос"
    },
    {
        "code": "Europe/Tirane",
        "name": "(UTC+02:00) Тирана, Саранда, Химара"
    },
    {
        "code": "Europe/Vaduz",
        "name": "(UTC+02:00) Вадуц, Гамприн"
    },
    {
        "code": "Europe/Vatican",
        "name": "(UTC+02:00) Ватикан"
    },
    {
        "code": "Europe/Vienna",
        "name": "(UTC+02:00) Вена, Вельс, Винер-Нойштадт"
    },
    {
        "code": "Europe/Warsaw",
        "name": "(UTC+02:00) Варшава, Лодзь, Краков"
    },
    {
        "code": "Europe/Zagreb",
        "name": "(UTC+02:00) Загреб, Риека, Винковцы"
    },
    {
        "code": "Europe/Zurich",
        "name": "(UTC+02:00) Берн, Винтертур, Тун"
    },
    {
        "code": "Africa/Addis_Ababa",
        "name": "(UTC+03:00) Аддис-Абеба, Дыре-Дауа, Адама"
    },
    {
        "code": "Africa/Asmera",
        "name": "(UTC+03:00) Асмэра, Массауа"
    },
    {
        "code": "Africa/Dar_es_Salaam",
        "name": "(UTC+03:00) Дар-эс-Салам, Мванза, Аруша"
    },
    {
        "code": "Africa/Djibouti",
        "name": "(UTC+03:00) Джибути"
    },
    {
        "code": "Africa/Kampala",
        "name": "(UTC+03:00) Кампала, Джинджа, Энтеббе"
    },
    {
        "code": "Africa/Mogadishu",
        "name": "(UTC+03:00) Могадишо, Харгейса, Бербера"
    },
    {
        "code": "Africa/Nairobi",
        "name": "(UTC+03:00) Найроби, Момбаса, Кисуму"
    },
    {
        "code": "Asia/Aden",
        "name": "(UTC+03:00) Сана, Эль-Бейда, Амран"
    },
    {
        "code": "Asia/Amman",
        "name": "(UTC+03:00) Амман, Маан, Акаба"
    },
    {
        "code": "Asia/Baghdad",
        "name": "(UTC+03:00) Багдад, Басра, Мосул"
    },
    {
        "code": "Asia/Bahrain",
        "name": "(UTC+03:00) Доха, Манама"
    },
    {
        "code": "Asia/Beirut",
        "name": "(UTC+03:00) Бейрут, Эн-Набатия, Захле"
    },
    {
        "code": "Asia/Damascus",
        "name": "(UTC+03:00) Алеппо, Дамаск, Эль-Хасака"
    },
    {
        "code": "Asia/Gaza",
        "name": "(UTC+03:00) Рамалла, Газа"
    },
    {
        "code": "Asia/Jerusalem",
        "name": "(UTC+03:00) Иерусалим, Тель-Авив, Хайфа"
    },
    {
        "code": "Asia/Kuwait",
        "name": "(UTC+03:00) Эль-Кувейт"
    },
    {
        "code": "Asia/Nicosia",
        "name": "(UTC+03:00) Никосия, Паралимни, Лапитос"
    },
    {
        "code": "Asia/Riyadh",
        "name": "(UTC+03:00) Эр-Рияд, Джидда, Мекка"
    },
    {
        "code": "Europe/Athens",
        "name": "(UTC+03:00) Афины, Пирей, Волос"
    },
    {
        "code": "Europe/Bucharest",
        "name": "(UTC+03:00) Бухарест, Дорохой, Гура-Гуморулуй"
    },
    {
        "code": "Europe/Helsinki",
        "name": "(UTC+03:00) Хельсинки, Эспоо, Вантаа"
    },
    {
        "code": "Europe/Istanbul",
        "name": "(UTC+03:00) Стамбул, Анкара, Измир"
    },
    {
        "code": "Europe/Kyiv",
        "name": "(UTC+03:00) Киев, Харьков, Днепр"
    },
    {
        "code": "Europe/Minsk",
        "name": "(UTC+03:00) Минск, Гомель, Витебск"
    },
    {
        "code": "Europe/Moscow",
        "name": "(UTC+03:00) Москва, Санкт-Петербург, Казань"
    },
    {
        "code": "Europe/Riga",
        "name": "(UTC+03:00) Рига, Даугавпилс, Лиепая"
    },
    {
        "code": "Europe/Sofia",
        "name": "(UTC+03:00) София, Варна, Тырговиште"
    },
    {
        "code": "Europe/Tallinn",
        "name": "(UTC+03:00) Таллин, Тарту, Нарва"
    },
    {
        "code": "Europe/Vilnius",
        "name": "(UTC+03:00) Вильнюс, Каунас, Клайпеда"
    },
    {
        "code": "Europe/Volgograd",
        "name": "(UTC+03:00) Волгоград, Волжский, Камышин"
    },
    {
        "code": "Indian/Antananarivo",
        "name": "(UTC+03:00) Антананариву, Туамасина, Анцирабе"
    },
    {
        "code": "Indian/Comoro",
        "name": "(UTC+03:00) Морони"
    },
    {
        "code": "Asia/Tehran",
        "name": "(UTC+03:30) Тегеран, Мешхед, Исфахан"
    },
    {
        "code": "Asia/Baku",
        "name": "(UTC+04:00) Баку, Сумгаит, Гянджа"
    },
    {
        "code": "Asia/Dubai",
        "name": "(UTC+04:00) Дубай, Абу-Даби, Шарджа"
    },
    {
        "code": "Asia/Muscat",
        "name": "(UTC+04:00) Маскат, Эс-Сиб, Баушар"
    },
    {
        "code": "Asia/Tbilisi",
        "name": "(UTC+04:00) Тбилиси, Батуми, Кутаиси"
    },
    {
        "code": "Asia/Yerevan",
        "name": "(UTC+04:00) Ереван, Гюмри, Ванадзор"
    },
    {
        "code": "Europe/Astrakhan",
        "name": "(UTC+04:00) Астрахань, Ахтубинск, Знаменск"
    },
    {
        "code": "Europe/Samara",
        "name": "(UTC+04:00) Самара, Тольятти, Ижевск"
    },
    {
        "code": "Europe/Saratov",
        "name": "(UTC+04:00) Саратов, Энгельс, Балаково"
    },
    {
        "code": "Europe/Ulyanovsk",
        "name": "(UTC+04:00) Ульяновск, Димитровград, Инза"
    },
    {
        "code": "Indian/Mauritius",
        "name": "(UTC+04:00) Порт-Луи, Вакоа-Феникс, Виктория"
    },
    {
        "code": "Indian/Reunion",
        "name": "(UTC+04:00) Сен-Дени, Сен-Пьер, Силао"
    },
    {
        "code": "Asia/Kabul",
        "name": "(UTC+04:30) Кабул, Кандагар, Герат"
    },
    {
        "code": "Asia/Almaty",
        "name": "(UTC+05:00) Алматы, Астана, Шымкент"
    },
    {
        "code": "Asia/Aqtau",
        "name": "(UTC+05:00) Актау"
    },
    {
        "code": "Asia/Aqtobe",
        "name": "(UTC+05:00) Актобе, Уральск, Атырау"
    },
    {
        "code": "Asia/Ashgabat",
        "name": "(UTC+05:00) Ашхабад, Туркменабад, Дашогуз"
    },
    {
        "code": "Asia/Dushanbe",
        "name": "(UTC+05:00) Душанбе, Худжанд, Куляб"
    },
    {
        "code": "Asia/Karachi",
        "name": "(UTC+05:00) Карачи, Лахор, Фейсалабад"
    },
    {
        "code": "Asia/Qyzylorda",
        "name": "(UTC+05:00) Кызылорда, Байконур, Аральск"
    },
    {
        "code": "Asia/Tashkent",
        "name": "(UTC+05:00) Ташкент, Наманган, Самарканд"
    },
    {
        "code": "Asia/Yekaterinburg",
        "name": "(UTC+05:00) Екатеринбург, Челябинск, Уфа"
    },
    {
        "code": "Indian/Maldives",
        "name": "(UTC+05:00) Мале, Адду, Фувахмулах"
    },
    {
        "code": "Asia/Colombo",
        "name": "(UTC+05:30) Полоннарува, Дехивала-Маунт-Лавиния, Негомбо"
    },
    {
        "code": "Asia/Kolkata",
        "name": "(UTC+05:30) Мумбаи, Дели, Бангалор"
    },
    {
        "code": "Asia/Kathmandu",
        "name": "(UTC+05:45) Катманду, Покхара, Бхаратпур"
    },
    {
        "code": "Asia/Bishkek",
        "name": "(UTC+06:00) Бишкек, Ош, Джалал-Абад"
    },
    {
        "code": "Asia/Dhaka",
        "name": "(UTC+06:00) Дакка, Читтагонг, Нараянгандж"
    },
    {
        "code": "Asia/Omsk",
        "name": "(UTC+06:00) Омск, Тара, Калачинск"
    },
    {
        "code": "Asia/Thimphu",
        "name": "(UTC+06:00) Тхимпху"
    },
    {
        "code": "Asia/Rangoon",
        "name": "(UTC+06:30) Янгон, Мандалай, Нейпьидо"
    },
    {
        "code": "Indian/Cocos",
        "name": "(UTC+06:30) Уэст-Айленд"
    },
    {
        "code": "Asia/Bangkok",
        "name": "(UTC+07:00) Бангкок, Самутпракан, Самутсонгкхрам"
    },
    {
        "code": "Asia/Barnaul",
        "name": "(UTC+07:00) Барнаул, Бийск, Рубцовск"
    },
    {
        "code": "Asia/Hovd",
        "name": "(UTC+07:00) Улаангом"
    },
    {
        "code": "Asia/Jakarta",
        "name": "(UTC+07:00) Джакарта, Сурабая, Бандунг"
    },
    {
        "code": "Asia/Krasnoyarsk",
        "name": "(UTC+07:00) Красноярск, Абакан, Норильск"
    },
    {
        "code": "Asia/Novokuznetsk",
        "name": "(UTC+07:00) Кемерово, Новокузнецк, Прокопьевск"
    },
    {
        "code": "Asia/Novosibirsk",
        "name": "(UTC+07:00) Новосибирск, Бердск, Искитим"
    },
    {
        "code": "Asia/Phnom_Penh",
        "name": "(UTC+07:00) Пномпень, Баттамбанг, Сиануквиль"
    },
    {
        "code": "Asia/Tomsk",
        "name": "(UTC+07:00) Томск, Северск, Стрежевой"
    },
    {
        "code": "Asia/Vientiane",
        "name": "(UTC+07:00) Хошимин, Ханой, Хайфон"
    },
    {
        "code": "Asia/Brunei",
        "name": "(UTC+08:00) Бандар-Сери-Бегаван, Куала-Белаит"
    },
    {
        "code": "Asia/Harbin",
        "name": "(UTC+08:00) Харбин"
    },
    {
        "code": "Asia/Irkutsk",
        "name": "(UTC+08:00) Иркутск, Улан-Удэ, Братск"
    },
    {
        "code": "Asia/Kuala_Lumpur",
        "name": "(UTC+08:00) Куала-Лумпур, Ипох, Шах-Алам"
    },
    {
        "code": "Asia/Macau",
        "name": "(UTC+08:00) Макао (Аомынь)"
    },
    {
        "code": "Asia/Makassar",
        "name": "(UTC+08:00) Макасар, Сукавати, Танджунгселор"
    },
    {
        "code": "Asia/Manila",
        "name": "(UTC+08:00) Кесон-Сити, Давао, Манила"
    },
    {
        "code": "Asia/Shanghai",
        "name": "(UTC+08:00) Чунцин, Шанхай, Пекин"
    },
    {
        "code": "Asia/Singapore",
        "name": "(UTC+08:00) Сингапур"
    },
    {
        "code": "Asia/Taipei",
        "name": "(UTC+08:00) Нанкин"
    },
    {
        "code": "Asia/Ulaanbaatar",
        "name": "(UTC+08:00) Улан-Батор, Сайншанд, Арвайхээр"
    },
    {
        "code": "Australia/Perth",
        "name": "(UTC+08:00) Перт, Рокингем, Банбери"
    },
    {
        "code": "Asia/Chita",
        "name": "(UTC+09:00) Чита, Краснокаменск, Борзя"
    },
    {
        "code": "Asia/Dili",
        "name": "(UTC+09:00) Дили"
    },
    {
        "code": "Asia/Jayapura",
        "name": "(UTC+09:00) Мерауке"
    },
    {
        "code": "Asia/Pyongyang",
        "name": "(UTC+09:00) Пхеньян, Чхонджин"
    },
    {
        "code": "Asia/Seoul",
        "name": "(UTC+09:00) Сеул, Пусан, Инчхон"
    },
    {
        "code": "Asia/Tokyo",
        "name": "(UTC+09:00) Токио, Йокогама, Осака"
    },
    {
        "code": "Asia/Yakutsk",
        "name": "(UTC+09:00) Якутск, Благовещенск, Белогорск"
    },
    {
        "code": "Pacific/Palau",
        "name": "(UTC+09:00) Корор, Нгерулмуд"
    },
    {
        "code": "Australia/Adelaide",
        "name": "(UTC+09:30) Аделаида, Маунт-Гамбир, Уайалла"
    },
    {
        "code": "Australia/Broken_Hill",
        "name": "(UTC+09:30) Брокен Хилл"
    },
    {
        "code": "Australia/Darwin",
        "name": "(UTC+09:30) Дарвин, Алис-Спрингс, Кэтрин"
    },
    {
        "code": "Asia/Vladivostok",
        "name": "(UTC+10:00) Хабаровск, Владивосток, Комсомольск-на-Амуре"
    },
    {
        "code": "Australia/Brisbane",
        "name": "(UTC+10:00) Брисбен, Голд-Кост, Саншайн-Кост"
    },
    {
        "code": "Australia/Hobart",
        "name": "(UTC+10:00) Хобарт, Лонсестон, Девонпорт"
    },
    {
        "code": "Australia/Melbourne",
        "name": "(UTC+10:00) Мельбурн, Джелонг, Балларат"
    },
    {
        "code": "Australia/Sydney",
        "name": "(UTC+10:00) Сидней, Канберра, Вуллонгонг"
    },
    {
        "code": "Pacific/Guam",
        "name": "(UTC+10:00) Хагатна"
    },
    {
        "code": "Pacific/Port_Moresby",
        "name": "(UTC+10:00) Порт-Морсби, Лаэ, Маунт-Хаген"
    },
    {
        "code": "Pacific/Yap",
        "name": "(UTC+10:00) Вено, Колониа, Паликир"
    },
    {
        "code": "Asia/Magadan",
        "name": "(UTC+11:00) Магадан, Сусуман"
    },
    {
        "code": "Asia/Sakhalin",
        "name": "(UTC+11:00) Южно-Сахалинск, Корсаков, Холмск"
    },
    {
        "code": "Asia/Srednekolymsk",
        "name": "(UTC+11:00) Среднеколымск, Северо-Курильск"
    },
    {
        "code": "Pacific/Efate",
        "name": "(UTC+11:00) Хониара, Порт-Вила, Сола"
    },
    {
        "code": "Pacific/Norfolk",
        "name": "(UTC+11:00) Кингстон"
    },
    {
        "code": "Pacific/Noumea",
        "name": "(UTC+11:00) Нумеа, Кумак, Ве"
    },
    {
        "code": "Asia/Kamchatka",
        "name": "(UTC+12:00) Петропавловск-Камчатский, Елизово, Вилючинск"
    },
    {
        "code": "Pacific/Auckland",
        "name": "(UTC+12:00) Окленд, Веллингтон, Крайстчерч"
    },
    {
        "code": "Pacific/Fiji",
        "name": "(UTC+12:00) Сува, Нанди, Лабаса"
    },
    {
        "code": "Pacific/Funafuti",
        "name": "(UTC+12:00) Фунафути"
    },
    {
        "code": "Pacific/Majuro",
        "name": "(UTC+12:00) Маджуро"
    },
    {
        "code": "Pacific/Nauru",
        "name": "(UTC+12:00) Ярен"
    },
    {
        "code": "Pacific/Tarawa",
        "name": "(UTC+12:00) Южная Тарава, Байрики"
    },
    {
        "code": "Pacific/Apia",
        "name": "(UTC+13:00) Апиа"
    },
    {
        "code": "Pacific/Fakaofo",
        "name": "(UTC+13:00) Атафу, Факаофо, Нукунону"
    },
    {
        "code": "Pacific/Tongatapu",
        "name": "(UTC+13:00) Нукуалофа, Нейафу, Пангаи"
    }
]

Suggested solution

Alternative

No response

Additional context

No response

Validations

  • Check that there isn't already an issue that request the same feature to avoid creating a duplicate.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels
    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions