Работа с временными зонами в Luxon строится вокруг строгого
разделения момента времени и его представления в конкретной зоне. Любая
дата в библиотеке описывается через объект DateTime,
который всегда включает информацию о зоне, даже если она не указана
явно.
В Luxon время хранится как абсолютный момент (timestamp), а отображается через часовой пояс (zone).
Ключевые особенности:
Пример создания текущего времени:
import { DateTime } from "luxon";
const dt = DateTime.now();
Зона берётся из среды выполнения (браузер или Node.js).
Luxon опирается на IANA Time Zone Database и поддерживает несколько типов зон.
Наиболее распространённый тип:
DateTime.now().setZone("Europe/Paris");
DateTime.now().setZone("Asia/Almaty");
IANA-зоны учитывают:
UTC — базовая универсальная зона:
DateTime.now().toUTC();
или:
DateTime.utc();
UTC используется как нейтральная точка отсчёта без смещения.
Фиксированные смещения от UTC:
DateTime.now().setZone("UTC+5");
или через объект:
DateTime.fromObject(
{ hour: 10 },
{ zone: "UTC-3" }
);
Особенности:
Системная зона определяется окружением:
DateTime.local();
Эквивалент:
DateTime.now().zoneName;
Основной метод переключения зон:
const dt = DateTime.now();
const parisTime = dt.setZone("Europe/Paris");
Важно: момент времени остаётся тем же, меняется только отображение.
При смене зоны можно сохранить «человеческое» время:
const dt = DateTime.now();
const shifted = dt.setZone("Asia/Tokyo", {
keepLocalTime: true
});
Поведение:
Это используется при интерпретации пользовательского ввода.
Одна из ключевых возможностей Luxon — преобразование одного времени в разные зоны.
const base = DateTime.fromISO("2026-01-01T10:00:00", {
zone: "UTC"
});
const moscow = base.setZone("Europe/Moscow");
const newYork = base.setZone("America/New_York");
Все три объекта представляют один и тот же момент времени.
const local = DateTime.local();
const utc = local.toUTC();
const utcTime = DateTime.utc();
const localTime = utcTime.toLocal();
Luxon позволяет вычислять разницу между моментами, учитывая зоны:
const a = DateTime.fromISO("2026-01-01T10:00", { zone: "UTC" });
const b = DateTime.fromISO("2026-01-01T10:00", { zone: "Asia/Almaty" });
const diff = a.diff(b, "hours").hours;
Результат учитывает фактическое смещение между зонами.
IANA-зоны включают правила перехода на летнее время.
Пример:
const winter = DateTime.fromISO("2026-01-15", { zone: "Europe/Berlin" });
const summer = DateTime.fromISO("2026-07-15", { zone: "Europe/Berlin" });
console.log(winter.offset);
console.log(summer.offset);
Сдвиг может отличаться в зависимости от сезона.
const dt = DateTime.now();
console.log(dt.zoneName);
console.log(dt.offset);
zoneName — название зоныoffset — смещение в минутах от UTCdt.isOffsetFixed;
Возвращает true, если зона не учитывает DST.
Luxon позволяет задавать глобальную зону по умолчанию:
import { Settings } from "luxon";
Settings.defaultZone = "utc";
или:
Settings.defaultZone = "Europe/Moscow";
После этого все операции используют заданную зону, если не указано иное.
const dt = DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 12 },
{ zone: "Asia/Almaty" }
);
const dt = DateTime.fromISO("2026-01-01T12:00", {
zone: "Europe/Paris"
});
const dt = DateTime.fromISO("2026-01-01T10:00", {
zone: "UTC"
});
const shifted = dt.setZone("Europe/Moscow");
Абсолютное время одинаково, меняется только отображение.
const dt = DateTime.fromISO("2026-01-01T10:00", {
zone: "UTC"
});
const interpreted = dt.setZone("Europe/Moscow", {
keepLocalTime: true
});
Теперь 10:00 интерпретируется как московское время, что даёт другой timestamp.
Luxon автоматически нормализует некорректные зоны:
Проверка:
const dt = DateTime.fromISO("2026-01-01", { zone: "Invalid/Zone" });
dt.isValid;
Форматирование всегда зависит от текущей зоны объекта:
const dt = DateTime.now().setZone("Asia/Tokyo");
dt.toLocaleString(DateTime.DATETIME_FULL);
При смене зоны изменяется:
При сравнении учитывается абсолютный момент:
const a = DateTime.fromISO("2026-01-01T10:00", { zone: "UTC" });
const b = DateTime.fromISO("2026-01-01T15:00", { zone: "Asia/Almaty" });
console.log(a.equals(b));
Результат зависит от совпадения timestamp, а не строкового представления.
Типовой сценарий:
const utc = DateTime.utc();
const zones = [
"Europe/London",
"Europe/Moscow",
"Asia/Tokyo"
];
const mapped = zones.map(zone =>
utc.setZone(zone).toISO()
);
Каждая строка отражает один и тот же момент времени в разных регионах.
Luxon использует единую модель:
Эта модель обеспечивает предсказуемость при работе с распределёнными системами, API и пользовательскими интерфейсами, где данные поступают из разных часовых поясов.