В библиотеке Luxon работа с временем строится вокруг строгого
разделения между моментом времени (instant) и его
представлением в конкретном часовом поясе (zone). Любое
значение DateTime содержит две ключевые составляющие:
Такой подход позволяет избежать классических ошибок JavaScript Date, связанных с неявными преобразованиями и потерей зоны.
import { DateTime } from "luxon";
Фиксация часового пояса в Luxon — это процесс явного закрепления зоны
за объектом DateTime, при котором:
Ключевой момент: Luxon не изменяет сам момент времени, если используется корректная работа с зонами — изменяется только способ его интерпретации.
const dt = DateTime.fromISO("2026-05-24T12:00:00", {
zone: "Europe/Amsterdam"
});
В этом случае:
const dt = DateTime.local();
или явно:
const dt = DateTime.now().setZone("system");
Здесь фиксация происходит на уровне системной зоны окружения (браузер/сервер).
const dt = DateTime.utc(2026, 5, 24, 10).setZone("Asia/Almaty");
Результат:
const dt = DateTime.fromObject(
{ year: 2026, month: 5, day: 24, hour: 10 },
{ zone: "Asia/Almaty" }
);
Здесь:
Одним из ключевых механизмов фиксации является параметр
keepLocalTime.
const dt = DateTime.fromISO("2026-05-24T10:00:00", {
zone: "Europe/London"
}).setZone("Asia/Tokyo", { keepLocalTime: true });
Поведение:
Это важно для сценариев, где пользователь «переносит» локальное время между регионами.
UTC используется как эталонная зона, полностью исключающая влияние локальных настроек.
const dt = DateTime.utc(2026, 5, 24, 12);
или
const dt = DateTime.fromISO("2026-05-24T12:00:00Z");
Особенности:
const dt = DateTime.now().setZone("Asia/Almaty");
const iso = dt.toISO();
Результат включает смещение:
2026-05-24T18:00:00.000+06:00
dt.toUTC().toISO();
Результат:
2026-05-24T12:00:00.000Z
Luxon по умолчанию использует системную зону окружения:
DateTime.local().zoneName;
Это создаёт риск неоднозначности:
Фиксация зоны устраняет эту неопределённость:
const dt = DateTime.local().setZone("UTC");
const original = DateTime.fromISO("2026-05-24T10:00:00", {
zone: "Asia/Almaty"
});
const converted = original.setZone("Europe/Berlin");
Свойства:
DateTime.fromISO("2026-05-24T10:00:00Z", { zone: "Asia/Almaty" });
Проблема:
Корректный вариант:
DateTime.fromISO("2026-05-24T10:00:00Z").setZone("Asia/Almaty");
const saved = dt.toISO();
const restored = DateTime.fromISO(saved);
Если строка не содержит смещения, зона будет восстановлена как системная.
Решение:
const restored = DateTime.fromISO(saved, { zone: dt.zone });
В архитектурах приложений часто требуется гарантированная зона:
const FIXED_ZONE = "Asia/Almaty";
function now() {
return DateTime.now().setZone(FIXED_ZONE);
}
Такой подход:
При операциях сложения и вычитания Luxon сохраняет зону:
const dt = DateTime.fromISO("2026-05-24T10:00:00", {
zone: "Asia/Almaty"
});
const next = dt.plus({ days: 1 });
Свойства:
В зонах с DST возможны неоднозначные моменты:
DateTime.fromISO("2026-03-29T02:30:00", {
zone: "Europe/Berlin"
});
Luxon:
Фиксация зоны здесь означает сохранение правил интерпретации локального времени, а не игнорирование DST.
DateTime.local();
DateTime.utc();
DateTime.fromObject({}, { zone: "Asia/Almaty" });
Рекомендуемая модель:
Хранение:
const stored = dt.toUTC().toISO();
Восстановление:
const dt = DateTime.fromISO(stored, { zone: "UTC" });
Дальнейшая локализация:
dt.setZone("Asia/Almaty");
Так обеспечивается: