Получение свойств часового пояса

Библиотека Luxon опирается на концепцию полноценных временных зон IANA и предоставляет объектную модель, в которой часовой пояс является не просто строковым смещением, а самостоятельной сущностью с набором свойств, правил перехода и методов преобразования.

Каждый объект DateTime связан с зоной через поле zone, а доступ к характеристикам осуществляется через методы экземпляра и свойства зоны.


Представление часовой зоны

В Luxon часовой пояс задаётся через:

  • IANA-идентификаторы ("Europe/Berlin", "Asia/Almaty")
  • фиксированные смещения ("UTC+3", -180)
  • системную зону устройства
  • UTC как отдельную каноническую зону

Примеры создания даты с зоной:

import { DateTime } from "luxon";

const dt1 = DateTime.now().setZone("Asia/Almaty");
const dt2 = DateTime.now().setZone("UTC");
const dt3 = DateTime.now().setZone("Europe/Berlin");

Основные свойства часовой зоны

zoneName

Свойство zoneName возвращает строковое имя текущей зоны:

const dt = DateTime.now().setZone("Asia/Almaty");

dt.zoneName; // "Asia/Almaty"

Для UTC:

DateTime.utc().zoneName; // "UTC"

offset (смещение в минутах)

Свойство offset возвращает смещение от UTC в минутах на конкретный момент времени.

const dt = DateTime.now().setZone("Asia/Almaty");

dt.offset; // например, 360 (UTC+6)

Особенность заключается в том, что значение зависит от даты, так как в зонах с переходом на летнее время смещение изменяется.


offsetNameShort и offsetNameLong

Luxon позволяет получать человекочитаемые обозначения смещения.

const dt = DateTime.now().setZone("Europe/Berlin");

dt.offsetNameShort; // "CET" или "CEST"
dt.offsetNameLong;  // "Central European Standard Time"

Для зон без DST значения будут стабильными:

DateTime.now().setZone("Asia/Almaty").offsetNameShort; // "GMT+6"

Получение информации через zone

Каждый DateTime содержит объект зоны, доступный через zone.

const dt = DateTime.now().setZone("Asia/Almaty");

dt.zone.name;        // "Asia/Almaty"
dt.zone.type;        // "iana"
dt.zone.isUniversal; // false

Типы зон

Luxon различает несколько типов зон:

IANA-зоны

Наиболее важный тип, основанный на базе tz database.

dt.zone.type; // "iana"

FixedOffsetZone (фиксированное смещение)

Используется при явном указании смещения:

const dt = DateTime.now().setZone("UTC+5");

dt.zone.type; // "fixed"

Такие зоны не учитывают переходы на летнее время.


SystemZone

Зона устройства:

DateTime.local().zone.type; // "system"

Она зависит от операционной системы и настроек окружения.


Проверка корректности зоны

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

const dt = DateTime.now().setZone("Invalid/Zone");

dt.isValid;      // false
dt.invalidReason; // причина ошибки

Часто встречающиеся причины:

  • неизвестный IANA-идентификатор
  • неподдерживаемый формат строки
  • отсутствие данных в tz database

Сравнение зон

Объекты зон можно сравнивать через метод equals:

const z1 = DateTime.now().setZone("Asia/Almaty").zone;
const z2 = DateTime.now().setZone("UTC+6").zone;

z1.equals(z2); // true (в некоторых случаях false из-за типа зоны)

Важно учитывать, что сравнение учитывает не только смещение, но и тип зоны.


Получение текущего смещения

Через объект DateTime:

const dt = DateTime.now().setZone("Asia/Almaty");

dt.offset; // 360

Через форматирование:

dt.toFormat("ZZ"); // +06:00

Форматы отображения смещения

Luxon поддерживает разные форматы вывода:

Короткий формат

dt.toFormat("ZZZ"); // "GMT+6"

Полный формат

dt.toFormat("ZZZZ"); // "GMT+06:00"

Получение системной информации о зоне

import { Settings } from "luxon";

Settings.defaultZoneName; // системная зона

Также можно явно проверить:

DateTime.local().zoneName;

Работа с IANA-идентификаторами

Luxon использует стандарт IANA, поэтому доступен полный набор зон:

  • "Europe/London"
  • "America/New_York"
  • "Asia/Tokyo"

Пример проверки:

const dt = DateTime.now().setZone("America/New_York");

dt.zoneName; // "America/New_York"

UTC как базовая зона

UTC рассматривается как отдельная каноническая зона:

const dt = DateTime.utc();

dt.zoneName; // "UTC"
dt.offset;   // 0

Переход между зонами и влияние на свойства

При смене зоны изменяются все связанные свойства:

const dt = DateTime.now();

const berlin = dt.setZone("Europe/Berlin");
const tokyo = dt.setZone("Asia/Tokyo");

berlin.offset; // зависит от даты
tokyo.offset;  // обычно +540

Важно, что момент времени остаётся тем же, меняется только представление.


Формирование строкового представления зоны

const dt = DateTime.now().setZone("Asia/Almaty");

dt.zone.toString(); // "Asia/Almaty"

Для фиксированных зон:

DateTime.now().setZone("UTC+4").zone.toString(); // "UTC+04:00"

Проверка поддержки зоны окружением

Luxon использует Intl API JavaScript. Если окружение ограничено, часть зон может работать некорректно.

typeof Intl.DateTimeFormat; // должно быть "function"

Особенности динамических смещений

В IANA-зонах смещение зависит от даты:

const winter = DateTime.fromISO("2025-01-01", { zone: "Europe/Berlin" });
const summer = DateTime.fromISO("2025-07-01", { zone: "Europe/Berlin" });

winter.offset !== summer.offset;

Это критично при расчётах времени событий.


Получение всех ключевых характеристик зоны

const dt = DateTime.now().setZone("Asia/Almaty");

const info = {
  name: dt.zoneName,
  offset: dt.offset,
  shortName: dt.offsetNameShort,
  longName: dt.offsetNameLong,
  valid: dt.isValid
};

Сводная модель свойств зоны

В рамках экземпляра DateTime доступ к часовому поясу включает:

  • идентификатор зоны (zoneName)
  • смещение (offset)
  • краткое и полное название (offsetNameShort, offsetNameLong)
  • объект зоны (zone)
  • тип зоны (zone.type)
  • корректность (isValid)

Эти элементы образуют единое представление временной локализации момента времени и позволяют точно работать с глобальными временными данными без потери контекста переходов, смещений и региональных правил.