Работа с часовыми поясами в JavaScript требует строгого контроля над
источником времени, его интерпретацией и преобразованием. Библиотека
Luxon предоставляет единый подход к управлению датами и временем через
объект DateTime, поддерживающий IANA-зоны, UTC и локальные
смещения.
В основе Luxon лежит представление времени как неизменяемого объекта
DateTime. Каждый экземпляр содержит:
Zone)Ключевая особенность заключается в разделении:
import { DateTime } from "luxon";
const dt = DateTime.local();
Созданный объект привязан к локальной системе, но сам момент может быть интерпретирован в другой зоне без изменения его абсолютного значения.
Luxon использует стандарт IANA Time Zone Database:
Europe/MoscowAsia/AlmatyAmerica/New_YorkUTCКаждая зона учитывает переходы на летнее время и исторические изменения смещений.
const dt = DateTime.fromObject(
{ year: 2026, month: 5, day: 23, hour: 12 },
{ zone: "Asia/Almaty" }
);
Основной метод преобразования времени между зонами —
setZone.
Он изменяет представление времени, сохраняя или
пересчитывая момент в зависимости от параметра
keepLocalTime.
const dt = DateTime.fromISO("2026-05-23T12:00:00", { zone: "UTC" });
const converted = dt.setZone("Asia/Almaty");
В этом случае:
Параметр keepLocalTime управляет тем, сохраняется ли
локальное время или абсолютный момент.
Сохраняется момент времени:
const dt = DateTime.fromISO("2026-05-23T12:00:00", { zone: "UTC" });
const converted = dt.setZone("Asia/Almaty", { keepLocalTime: false });
Результат:
Это корректное преобразование момента.
Сохраняется локальное отображение:
const dt = DateTime.fromObject(
{ year: 2026, month: 5, day: 23, hour: 12 },
{ zone: "UTC" }
);
const shifted = dt.setZone("Asia/Almaty", { keepLocalTime: true });
Результат:
Такой режим используется при переносе расписаний без изменения локального времени.
Часто используется стратегия нормализации через UTC.
const local = DateTime.fromISO("2026-05-23T12:00:00", {
zone: "Asia/Almaty"
});
const utc = local.toUTC();
const ny = utc.setZone("America/New_York");
Модель:
Это снижает вероятность ошибок при цепочках преобразований.
При создании даты важно задавать зону сразу, чтобы избежать неоднозначности.
const dt = DateTime.fromObject(
{
year: 2026,
month: 5,
day: 23,
hour: 9
},
{
zone: "America/New_York"
}
);
Если зона не указана, используется локальная система, что может приводить к различным результатам в разных средах исполнения.
Luxon поддерживает ISO-формат с указанием смещения:
const dt = DateTime.fromISO("2026-05-23T12:00:00+06:00");
Такой формат уже содержит информацию о смещении, но не всегда содержит IANA-зону.
Для корректной конвертации часто требуется уточнение зоны:
const dt = DateTime.fromISO("2026-05-23T12:00:00+06:00", {
zone: "Asia/Almaty"
});
Методы решают разные задачи преобразования:
setZone("UTC")const utc = dt.toUTC();
const local = DateTime.fromUTC(12, 30);
Luxon учитывает переходы на летнее время автоматически через IANA-базу.
Пример зоны с DST:
Europe/BerlinAmerica/Los_Angelesconst winter = DateTime.fromISO("2026-01-15T12:00:00", {
zone: "Europe/Berlin"
});
const summer = DateTime.fromISO("2026-07-15T12:00:00", {
zone: "Europe/Berlin"
});
Разница в смещении будет рассчитана автоматически.
Объект DateTime содержит свойства:
dt.zoneName; // строковое имя зоны
dt.offset; // смещение в минутах
Пример:
const dt = DateTime.now().setZone("Asia/Almaty");
console.log(dt.zoneName);
console.log(dt.offset);
Luxon допускает последовательные преобразования:
const result = DateTime.fromISO("2026-05-23T12:00:00", { zone: "UTC" })
.setZone("Asia/Almaty")
.setZone("America/New_York")
.toUTC();
Каждый шаг возвращает новый объект DateTime, не изменяя
исходный.
После преобразования важно учитывать, что форматирование зависит от текущей зоны объекта.
const dt = DateTime.fromISO("2026-05-23T12:00:00", { zone: "UTC" })
.setZone("Asia/Almaty");
const formatted = dt.toFormat("yyyy-MM-dd HH:mm ZZZZ");
Результат будет отражать локальное время зоны Алматы.
DateTime.fromISO("2026-05-23T12:00:00").setZone("Asia/Almaty");
Без явной исходной зоны время интерпретируется как локальное, что может сместить момент.
dt.setZone("UTC").toUTC();
Избыточное преобразование не изменяет результат, но усложняет логику.
dt.setZone("Asia/Almaty", { keepLocalTime: true });
Такое преобразование не сохраняет момент времени и может привести к несоответствию событий во времени.
При обработке событий часто используется единый стандарт хранения:
const stored = DateTime.fromISO(eventTime, { zone: "UTC" });
const displayed = stored.setZone(userZone);
Такая модель исключает неоднозначность при смене регионов и системных настроек.