Свойство offset

Свойство offset в объекте DateTime библиотеки Luxon представляет собой числовое значение смещения временной зоны относительно UTC, выраженное в минутах. Оно отражает текущую разницу между локальным временем заданной зоны и всемирным координированным временем.

Смысл и назначение offset

Любой момент времени в Luxon может быть представлен в разных временных зонах. Несмотря на то что сам момент (instant) не меняется, его локальное отображение зависит от часового пояса. Свойство offset фиксирует именно эту разницу:

  • положительное значение — зона опережает UTC
  • отрицательное значение — зона отстаёт от UTC

Значение всегда измеряется в минутах, что позволяет точно учитывать не только часовые, но и полчасовые и 45-минутные смещения, используемые в некоторых регионах мира.

Получение offset у DateTime

В Luxon offset доступен как вычисляемое свойство экземпляра DateTime:

import { DateTime } from "luxon";

const dt = DateTime.local();
console.log(dt.offset);

Возвращаемое значение зависит от локальной временной зоны среды выполнения.

Offset и временные зоны

Luxon тесно связывает offset с объектом зоны (zone), который определяет правила вычисления локального времени.

const dt = DateTime.now().setZone("Europe/Berlin");
console.log(dt.offset);

Для зоны Europe/Berlin значение будет изменяться в зависимости от периода года из-за перехода на летнее и зимнее время.

Влияние перехода на летнее время

Одной из ключевых особенностей offset является динамическое изменение при учёте DST (Daylight Saving Time).

Например:

  • зимой Центральноевропейское время: UTC+1 → offset = 60
  • летом Центральноевропейское время: UTC+2 → offset = 120

Luxon автоматически пересчитывает offset при работе с зонами, поддерживающими сезонные изменения.

const winter = DateTime.fromISO("2025-01-15", { zone: "Europe/Berlin" });
const summer = DateTime.fromISO("2025-07-15", { zone: "Europe/Berlin" });

console.log(winter.offset);
console.log(summer.offset);

Fixed offset зоны

Некоторые временные зоны не используют переход на летнее время и имеют фиксированное смещение. В таких случаях offset остаётся постоянным.

const dt = DateTime.now().setZone("UTC+5");
console.log(dt.offset);

Такие зоны полезны при работе с системами, где требуется стабильное смещение без сезонных изменений.

Offset и UTC

При создании объекта в UTC значение offset всегда равно нулю:

const dt = DateTime.utc();
console.log(dt.offset); // 0

Это связано с тем, что UTC является базовой временной шкалой без смещения.

Разница между offset и offsetName

В Luxon помимо числового offset существует строковое представление смещения:

  • offset — числовое значение в минутах
  • offsetNameShort — короткое текстовое представление (например, GMT+2)
  • offsetNameLong — полное название смещения
const dt = DateTime.now().setZone("Asia/Almaty");

console.log(dt.offset);
console.log(dt.offsetNameShort);
console.log(dt.offsetNameLong);

offset используется для вычислений, тогда как строковые представления предназначены для отображения.

Изменение offset через смену зоны

Свойство offset не задаётся напрямую. Оно всегда вычисляется на основе временной зоны:

const dt1 = DateTime.now().setZone("America/New_York");
const dt2 = DateTime.now().setZone("Asia/Tokyo");

console.log(dt1.offset);
console.log(dt2.offset);

Разница между значениями отражает разницу между временными зонами в данный момент времени.

Особенности вычисления offset

При вычислении offset Luxon учитывает:

  • IANA time zone database
  • правила перехода на летнее время
  • исторические изменения временных зон
  • конкретный момент времени (instant)

Это делает значение зависимым не только от зоны, но и от даты.

Использование offset в вычислениях

Хотя offset редко используется напрямую для форматирования времени, он полезен при низкоуровневых вычислениях:

  • конвертация времени между системами
  • синхронизация данных между разными зонами
  • построение собственных форматов отображения времени
function convertToUTCMinutes(dt) {
  return dt.toUTC().toMillis() + dt.offset * 60000;
}

Ограничения offset

offset не учитывает:

  • названия временных зон
  • исторические изменения после создания объекта
  • пользовательские форматы отображения

Он отражает только текущую разницу в минутах между локальным временем и UTC для конкретного момента времени.