Метод setZone в библиотеке Luxon предназначен для
изменения временной зоны у объекта DateTime без изменения
самого момента времени или с его пересчётом — в зависимости от
параметров. Ключевая особенность заключается в том, что объект
DateTime в Luxon остаётся неизменяемым: любой вызов
setZone возвращает новый экземпляр.
Основная задача метода — интерпретация уже существующего значения времени в другом часовом поясе.
Важно: поведение метода зависит от параметра сохранения локального времени, который определяет, будет ли изменена «абсолютная точка времени» или только её отображение.
dt.setZone(zone: string | Zone, { keepLocalTime?: boolean } = {}): DateTime
Параметры:
zone — строка IANA-таймзоны
("Europe/Paris", "Asia/Almaty") или объект
ZonekeepLocalTime — логический флаг, управляющий стратегией
преобразования времениВозвращаемое значение — новый объект DateTime.
При keepLocalTime: false (значение по умолчанию)
происходит пересчёт момента времени в новую зону.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2026-01-01T12:00:00", { zone: "UTC" });
const converted = dt.setZone("Asia/Tokyo");
converted.toISO();
Результат отражает тот же момент времени, но в часовом поясе Токио.
При keepLocalTime: true происходит иной сценарий:
локальные значения времени остаются неизменными, но меняется их
интерпретация.
const dt = DateTime.fromISO("2026-01-01T12:00:00", { zone: "UTC" });
const shifted = dt.setZone("Asia/Tokyo", { keepLocalTime: true });
shifted.toISO();
В этом случае 12:00 UTC начинает трактоваться как
12:00 Tokyo, что соответствует другому моменту времени.
| Режим | Что сохраняется | Что изменяется |
|---|---|---|
default (keepLocalTime: false) |
абсолютное время | локальное отображение |
keepLocalTime: true |
локальные компоненты | абсолютное время |
Ключевое различие: первый режим «переводит время», второй — «переназначает зону без сдвига цифр».
Метод поддерживает стандартные идентификаторы IANA:
Europe/LondonEurope/MoscowAsia/AlmatyAmerica/New_YorkПри передаче некорректной зоны Luxon использует fallback на локальную систему или UTC, в зависимости от конфигурации окружения.
Каждый вызов setZone создаёт новый объект:
const original = DateTime.local();
const upd ated = original.setZone("UTC");
original === updated; // false
Это критично при построении цепочек преобразований, где состояние не должно изменяться неожиданно.
Метод тесно связан с другими функциями Luxon:
dt.setZone("UTC");
dt.toLocal();
setZone изменяет зону интерпретацииtoUTC и toLocal выполняют
специализированные преобразованияDateTime.fromObject({ zone: "Asia/Tokyo" });
setZone применяется уже к существующему объекту, тогда
как fromObject задаёт зону при создании.
Метод хорошо комбинируется с форматированием и арифметикой времени:
const dt = DateTime.local()
.plus({ days: 1 })
.setZone("Europe/Paris")
.se t({ hour: 10 });
Каждый шаг возвращает новый DateTime, сохраняя
предсказуемость вычислений.
Использование keepLocalTime: true без понимания
последствий приводит к смещению абсолютного времени.
dt.setZone("UTC+3");
Подобный формат не является стандартным IANA-идентификатором и может давать непредсказуемый результат.
dt.setZone("UTC");
console.log(dt.zoneName);
Исходный объект остаётся неизменным, что часто игнорируется при первом знакомстве с API.
Luxon хранит момент времени в UTC и отдельно — информацию о временной
зоне. setZone изменяет именно слой интерпретации:
В системах, работающих с несколькими регионами, setZone
используется для:
После вызова setZone результат сериализации отражает
новую зону:
dt.setZone("Asia/Tokyo").toJSON();
В строке ISO будет указана соответствующая временная зона или смещение.
Метод влияет на все последующие операции форматирования:
dt.setZone("Europe/Paris").toFormat("HH:mm");
Вывод зависит от выбранной зоны, а не от исходной.
При добавлении или вычитании времени сначала выполняется пересчёт к UTC, затем применяется зона:
dt.setZone("UTC").plus({ hours: 5 });
Таким образом гарантируется корректность временных смещений независимо от локальной зоны.