Список доступных временных зон в js-joda определяется набором
идентификаторов IANA (tz database), которые подключаются через
дополнительный модуль @js-joda/timezone. Без этого
расширения библиотека @js-joda/core не содержит полноценной
информации о временных зонах и работает только с локальным временем и
UTC-подобными представлениями.
Ключевой источник данных о зонах — ZoneId, который
опирается на ZoneRulesProvider. Именно он предоставляет
перечень всех поддерживаемых идентификаторов временных зон и правила
переходов (DST, смещения и исторические изменения).
Все доступные зоны представлены строковыми идентификаторами в формате:
Region/CityRegion/Subregion/CityEtc/GMT±XПримеры:
Europe/MoscowEurope/BerlinAsia/AlmatyAsia/TokyoAmerica/New_YorkAmerica/Los_AngelesUTCЭти идентификаторы соответствуют стандарту IANA Time Zone Database и используются во всех современных системах работы со временем.
Для доступа к списку зон требуется установка и инициализация дополнительного пакета:
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>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/'));
Помимо ZoneId, доступ к тем же данным можно получить
через низкоуровневый API:
import { ZoneRulesProvider } from '@js-joda/core';
import '@js-joda/timezone';
const allZones = ZoneRulesProvider.getAvailableZoneIds();
Этот метод возвращает те же идентификаторы, но часто используется внутри библиотечных решений и при построении кастомных провайдеров.
Без подключения этого пакета список зон будет пустым или минимальным. Причина в архитектуре js-joda:
@js-joda/core — ядро без данных о зонах@js-joda/timezone — поставляет IANA-данные и правила
переходовПосле подключения происходит регистрация провайдера:
Перед использованием зоны можно проверить её доступность:
import { ZoneId } from '@js-joda/core';
import '@js-joda/timezone';
const zone = 'Asia/Almaty';
const exists = ZoneId.getAvailableZoneIds().has(zone);
console.log(exists);
Это важно при работе с пользовательским вводом или внешними API.
Любая строка из списка может быть преобразована в объект зоны:
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 считаются стабильными, но с оговорками:
Поэтому при хранении данных обычно фиксируется именно строковый идентификатор зоны, а не её внутреннее представление.