Временная зона с фиксированным смещением представляет собой способ интерпретации даты и времени без учёта правил перехода на летнее и зимнее время. В основе лежит постоянная величина смещения относительно UTC, выраженная в минутах или часах. В Luxon такие зоны используются как упрощённая модель временной локализации, где календарные изменения региона игнорируются, а сохраняется только арифметическое смещение.
Фиксированное смещение — это временная зона, в которой разница с UTC всегда постоянна.
Пример:
В отличие от IANA-зон (например, Europe/Berlin или
America/New_York), фиксированное смещение:
Luxon трактует такие зоны как отдельный класс сценариев, где время интерпретируется строго арифметически.
Luxon использует несколько способов задания фиксированного смещения:
Наиболее распространённый способ — строка в формате UTC-offset:
DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 12 },
{ zone: 'UTC+2' }
);
или:
DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 12 },
{ zone: 'UTC-05:00' }
);
Luxon интерпретирует такие значения как фиксированные смещения, не привязанные к правилам региона.
При разборе строк ISO 8601 смещение уже встроено в данные:
DateTime.fromISO('2026-01-01T10:00:00+03:00');
Такое значение автоматически превращается в дату с фиксированным смещением +180 минут.
Смещение становится частью временной точки, а не внешней настройкой.
Luxon предоставляет низкоуровневый механизм через
FixedOffsetZone:
import { FixedOffsetZone } from 'luxon';
const zone = FixedOffsetZone.instance(180);
Здесь значение 180 означает количество минут смещения
относительно UTC.
Использование:
DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 12 },
{ zone }
);
При использовании фиксированной зоны Luxon вычисляет локальное время следующим образом:
Пример:
const dt = DateTime.fromISO('2026-01-01T10:00:00+02:00');
dt.zoneName; // 'UTC+2' (логически фиксированная зона)
dt.offset; // 120 (минуты)
Свойство offset всегда отражает постоянное значение в
минутах.
Ключевое различие проявляется при переходе на летнее время.
DateTime.fromObject(
{ year: 2026, month: 6, day: 1, hour: 12 },
{ zone: 'Europe/Berlin' }
);
DateTime.fromObject(
{ year: 2026, month: 6, day: 1, hour: 12 },
{ zone: 'UTC+1' }
);
Фиксированное смещение часто используется как промежуточное представление при конвертации времени.
const dt = DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 12 },
{ zone: 'UTC+3' }
);
const utc = dt.toUTC();
const local = dt.toLocal();
При этом:
toUTC() убирает смещениеtoLocal() применяет системную локальную зону
устройстваМетод setZone сохраняет момент времени и изменяет только
интерпретацию:
const dt = DateTime.fromISO('2026-01-01T10:00:00+03:00');
const shifted = dt.setZone('UTC-5');
Здесь происходит:
Важный аспект фиксированных смещений — контроль интерпретации исходных компонентов даты.
const dt = DateTime.fromObject(
{ year: 2026, month: 1, day: 1, hour: 10 },
{ zone: 'UTC+2', keepLocalTime: true }
);
При keepLocalTime: true:
Без этого параметра Luxon интерпретирует объект как момент времени в указанной зоне.
Фиксированное смещение всегда выражается в минутах:
const dt = DateTime.fromISO('2026-01-01T10:00:00+03:30');
dt.offset; // 210
Это значение:
Luxon всегда хранит внутреннее значение как UTC-момент, а смещение применяется только при отображении:
Фиксированная зона влияет только на последний этап.
Фиксированные смещения применяются в случаях, когда:
Модель фиксированного смещения не отражает реальную временную политику большинства регионов. В результате:
При форматировании Luxon учитывает текущую зону:
dt.toFormat('yyyy-LL-dd HH:mm ZZZZ');
ZZZZ отображает смещениеISO-строки с оффсетом автоматически создают фиксированную зону:
DateTime.fromISO('2026-01-01T10:00:00-04:00');
В этом случае:
Даже при разных фиксированных смещениях сравнение происходит по UTC:
const a = DateTime.fromISO('2026-01-01T10:00:00+02:00');
const b = DateTime.fromISO('2026-01-01T09:00:00+01:00');
a.equals(b); // true
Оба значения указывают на один и тот же момент времени, несмотря на разные смещения.