Список доступных временных зон

Список доступных временных зон в js-joda определяется набором идентификаторов IANA (tz database), которые подключаются через дополнительный модуль @js-joda/timezone. Без этого расширения библиотека @js-joda/core не содержит полноценной информации о временных зонах и работает только с локальным временем и UTC-подобными представлениями.

Ключевой источник данных о зонах — ZoneId, который опирается на ZoneRulesProvider. Именно он предоставляет перечень всех поддерживаемых идентификаторов временных зон и правила переходов (DST, смещения и исторические изменения).


Все доступные зоны представлены строковыми идентификаторами в формате:

  • Region/City
  • Region/Subregion/City
  • Etc/GMT±X

Примеры:

  • Europe/Moscow
  • Europe/Berlin
  • Asia/Almaty
  • Asia/Tokyo
  • America/New_York
  • America/Los_Angeles
  • UTC

Эти идентификаторы соответствуют стандарту IANA Time Zone Database и используются во всех современных системах работы со временем.


Подключение временных зон в js-joda

Для доступа к списку зон требуется установка и инициализация дополнительного пакета:

import { ZoneId } from '@js-joda/core';
import '@js-joda/timezone';

Подключение @js-joda/timezone автоматически регистрирует ZoneRulesProvider, который подгружает все доступные зоны.


Получение полного списка временных зон

Основной метод для получения всех доступных идентификаторов:

import { ZoneId } from '@js-joda/core';
import '@js-joda/timezone';

const zones = ZoneId.getAvailableZoneIds();

console.log(zones);

Результатом является Set<string>, содержащий все поддерживаемые зоны.


Особенности структуры результата

Возвращаемое значение имеет следующие характеристики:

  • тип: Set<string>
  • порядок: не гарантирован (зависит от реализации)
  • содержит: все IANA идентификаторы, загруженные в ZoneRulesProvider

Для удобства работы часто требуется преобразование в массив:

const zoneArray = Array.from(ZoneId.getAvailableZoneIds());

Сортировка списка временных зон

Так как Set не гарантирует порядок, стандартной практикой является сортировка:

const sortedZones = Array.from(ZoneId.getAvailableZoneIds())
  .sort((a, b) => a.localeCompare(b));

console.log(sortedZones);

Сортировка упрощает поиск и отображение в пользовательских интерфейсах.


Фильтрация зон по регионам

Идентификаторы временных зон имеют иерархическую структуру, что позволяет легко фильтровать их по регионам.

Фильтрация по Европе

const europeZones = Array.from(ZoneId.getAvailableZoneIds())
  .filter(zone => zone.startsWith('Europe/'));

Фильтрация по Азии

const asiaZones = Array.from(ZoneId.getAvailableZoneIds())
  .filter(zone => zone.startsWith('Asia/'));

Фильтрация зон Америки

const americaZones = Array.from(ZoneId.getAvailableZoneIds())
  .filter(zone => zone.startsWith('America/'));

Использование ZoneRulesProvider

Помимо ZoneId, доступ к тем же данным можно получить через низкоуровневый API:

import { ZoneRulesProvider } from '@js-joda/core';
import '@js-joda/timezone';

const allZones = ZoneRulesProvider.getAvailableZoneIds();

Этот метод возвращает те же идентификаторы, но часто используется внутри библиотечных решений и при построении кастомных провайдеров.


Влияние пакета @js-joda/timezone

Без подключения этого пакета список зон будет пустым или минимальным. Причина в архитектуре js-joda:

  • @js-joda/core — ядро без данных о зонах
  • @js-joda/timezone — поставляет IANA-данные и правила переходов

После подключения происходит регистрация провайдера:

  • загрузка tzdb
  • регистрация правил смещений
  • активация всех ZoneId

Проверка наличия конкретной временной зоны

Перед использованием зоны можно проверить её доступность:

import { ZoneId } from '@js-joda/core';
import '@js-joda/timezone';

const zone = 'Asia/Almaty';

const exists = ZoneId.getAvailableZoneIds().has(zone);

console.log(exists);

Это важно при работе с пользовательским вводом или внешними API.


Создание ZoneId из доступных значений

Любая строка из списка может быть преобразована в объект зоны:

import { ZoneId } from '@js-joda/core';
import '@js-joda/timezone';

const zoneId = ZoneId.of('Europe/Moscow');

Если идентификатор отсутствует, будет выброшена ошибка DateTimeException.


Группировка временных зон

Для прикладных задач список зон часто группируется по регионам:

const zones = Array.from(ZoneId.getAvailableZoneIds());

const grouped = zones.reduce((acc, zone) => {
  const [region] = zone.split('/');
  if (!acc[region]) acc[region] = [];
  acc[region].push(zone);
  return acc;
}, {});

console.log(grouped);

Такой подход позволяет строить интерфейсы выбора временной зоны по континентам и регионам.


Особенности обновления списка зон

Список временных зон зависит от версии tz database, которая поставляется вместе с @js-joda/timezone. Обновления могут включать:

  • добавление новых регионов
  • переименование существующих зон
  • изменение правил перехода на летнее время
  • удаление устаревших идентификаторов

Поэтому разные версии пакета могут возвращать различный набор значений.


Частые категории временных зон

Внутри списка можно выделить несколько устойчивых групп:

  • географические зоны: Europe/*, Asia/*, America/*
  • системные: UTC, GMT, Etc/*
  • редкие исторические зоны: устаревшие идентификаторы, сохраняемые для совместимости

Производительность работы со списком зон

Операция ZoneId.getAvailableZoneIds() обычно:

  • выполняется быстро после инициализации провайдера
  • возвращает кэшированный набор данных
  • не требует сетевых запросов

Основная нагрузка возникает только при первичной загрузке @js-joda/timezone.


Использование списка зон в прикладных сценариях

Полученный набор идентификаторов применяется в следующих типичных задачах:

  • настройка пользовательского профиля часового пояса
  • конвертация времени между регионами
  • отображение локального времени для разных стран
  • интеграция с календарями и планировщиками
  • обработка событий в распределённых системах

Стабильность идентификаторов

Идентификаторы IANA считаются стабильными, но с оговорками:

  • старые названия могут сохраняться как alias
  • предпочтение отдаётся актуальным именам
  • некоторые зоны могут иметь исторические изменения смещения

Поэтому при хранении данных обычно фиксируется именно строковый идентификатор зоны, а не её внутреннее представление.