Библиотека Luxon опирается на концепцию полноценных временных зон IANA и предоставляет объектную модель, в которой часовой пояс является не просто строковым смещением, а самостоятельной сущностью с набором свойств, правил перехода и методов преобразования.
Каждый объект DateTime связан с зоной через поле
zone, а доступ к характеристикам осуществляется через
методы экземпляра и свойства зоны.
В Luxon часовой пояс задаётся через:
"Europe/Berlin",
"Asia/Almaty")"UTC+3",
-180)Примеры создания даты с зоной:
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 возвращает строковое имя текущей
зоны:
const dt = DateTime.now().setZone("Asia/Almaty");
dt.zoneName; // "Asia/Almaty"
Для UTC:
DateTime.utc().zoneName; // "UTC"
Свойство offset возвращает смещение от UTC в минутах на
конкретный момент времени.
const dt = DateTime.now().setZone("Asia/Almaty");
dt.offset; // например, 360 (UTC+6)
Особенность заключается в том, что значение зависит от даты, так как в зонах с переходом на летнее время смещение изменяется.
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"
Каждый DateTime содержит объект зоны, доступный через
zone.
const dt = DateTime.now().setZone("Asia/Almaty");
dt.zone.name; // "Asia/Almaty"
dt.zone.type; // "iana"
dt.zone.isUniversal; // false
Luxon различает несколько типов зон:
Наиболее важный тип, основанный на базе tz database.
dt.zone.type; // "iana"
Используется при явном указании смещения:
const dt = DateTime.now().setZone("UTC+5");
dt.zone.type; // "fixed"
Такие зоны не учитывают переходы на летнее время.
Зона устройства:
DateTime.local().zone.type; // "system"
Она зависит от операционной системы и настроек окружения.
Для диагностики используется:
const dt = DateTime.now().setZone("Invalid/Zone");
dt.isValid; // false
dt.invalidReason; // причина ошибки
Часто встречающиеся причины:
Объекты зон можно сравнивать через метод 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;
Luxon использует стандарт IANA, поэтому доступен полный набор зон:
"Europe/London""America/New_York""Asia/Tokyo"Пример проверки:
const dt = DateTime.now().setZone("America/New_York");
dt.zoneName; // "America/New_York"
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)Эти элементы образуют единое представление временной локализации момента времени и позволяют точно работать с глобальными временными данными без потери контекста переходов, смещений и региональных правил.