Метод isInDST

В Luxon свойство isInDST отражает, находится ли конкретный момент времени в зоне летнего времени (Daylight Saving Time, DST) для заданной временной зоны. Это вычисляемое логическое значение, зависящее не от самого времени как такового, а от правил часового пояса, применённых к данному моменту.

Природа DST и связь с часовыми поясами

Летнее время представляет собой сезонное смещение часов вперёд, применяемое в ряде регионов для экономии энергии и более рационального использования светового дня. Важный момент: DST не является универсальным — он определяется политикой конкретной временной зоны (IANA time zone database), например:

  • Europe/Berlin — использует DST
  • Europe/Moscow — не использует DST
  • Asia/Almaty — не использует DST в современных правилах

Luxon опирается на IANA-зоны через Intl API, поэтому поведение isInDST полностью соответствует системным правилам окружения.

Определение isInDST

В объекте DateTime свойство isInDST возвращает:

  • true — если момент времени попадает в период летнего времени
  • false — если DST не применяется или момент вне его периода

Ключевая особенность: проверка выполняется относительно временной зоны объекта, а не UTC.

Базовое использование

import { DateTime } from "luxon";

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

console.log(dt.isInDST);

В зависимости от даты выполнения код может вернуть true (лето) или false (зима).

Проверка конкретной даты

import { DateTime } from "luxon";

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

console.log(summer.isInDST); // true
console.log(winter.isInDST); // false

Здесь различие обусловлено сезонным смещением UTC+1 / UTC+2.

Влияние временной зоны

Свойство isInDST напрямую зависит от зоны, указанной в DateTime:

const utcTime = DateTime.fromISO("2024-07-01T12:00:00Z");

console.log(utcTime.setZone("UTC").isInDST); // false
console.log(utcTime.setZone("Europe/Berlin").isInDST); // true (если лето)

Один и тот же момент времени может одновременно:

  • быть в DST в одной зоне
  • не быть в DST в другой зоне

Внутренний принцип работы

Luxon использует системный Intl.DateTimeFormat для определения:

  • смещения зоны в конкретный момент
  • стандартного (standard offset)
  • летнего (daylight offset)

Если текущий offset отличается от стандартного для данной зоны, Luxon трактует момент как DST.

Упрощённо:

  • standard offset = базовое смещение
  • current offset ≠ standard offset → DST активно

Поведение в переходные периоды

Наибольшее значение isInDST имеет в дни перехода на летнее и зимнее время.

Весенний переход (spring forward)

Обычно происходит пропуск одного часа:

  • 02:00 → 03:00

В этот период:

  • несуществующие локальные времена не создаются напрямую
  • isInDST начинает возвращать true сразу после перехода
const dt = DateTime.fromISO("2024-03-31T03:30", { zone: "Europe/Berlin" });
console.log(dt.isInDST); // true
Осенний переход (fall back)

Происходит повторение одного часа:

  • 03:00 → 02:00

В этот период:

  • один и тот же локальный час может соответствовать двум моментам UTC
  • isInDST различает их через offset
const dt = DateTime.fromISO("2024-10-27T02:30", { zone: "Europe/Berlin" });
console.log(dt.isInDST);

Значение может быть true или false в зависимости от того, к какой части «двойного часа» относится момент.

Сравнение DST в разных зонах

const zones = ["Europe/London", "Asia/Tokyo", "America/New_York"];

zones.forEach(zone => {
  const dt = DateTime.now().setZone(zone);
  console.log(zone, dt.isInDST);
});

Результат:

  • Лондон и Нью-Йорк — изменяются по сезонам
  • Токио — всегда false, поскольку DST не используется

Отличие от offset

Частая ошибка — попытка заменить isInDST проверкой смещения:

dt.offset > 0

Это некорректно, так как:

  • DST может существовать при отрицательных offset
  • разные зоны имеют разные базовые смещения
  • offset не отражает стандарт зоны

Правильный способ — использовать:

dt.isInDST

Связь с другими свойствами DateTime

isInDST часто используется совместно с:

  • offset — текущее смещение в минутах
  • offsetNameShort — короткое обозначение зоны (например, CEST, EST)
  • zoneName — IANA-идентификатор зоны

Пример комплексного анализа:

const dt = DateTime.now().setZone("America/New_York");

console.log({
  isInDST: dt.isInDST,
  offset: dt.offset,
  zone: dt.zoneName
});

Использование в логике приложений

DST влияет на:

  • расписания задач
  • планировщики событий
  • финансовые операции с временными метками
  • календарные системы

Пример корректировки поведения:

function getMeetingTime(dt) {
  return dt.isInDST
    ? dt.plus({ hours: 1 })
    : dt;
}

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

Важно учитывать:

  • isInDST вычисляется динамически при создании объекта
  • изменение зоны через setZone пересчитывает значение
  • неизменяемость DateTime гарантирует консистентность
const dt1 = DateTime.now();
const dt2 = dt1.setZone("Europe/Paris");

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

Ограничения и зависимость от окружения

Luxon не хранит собственную базу правил DST. Он зависит от:

  • ICU данных JavaScript-движка (V8, SpiderMonkey, JavaScriptCore)
  • операционной системы (в некоторых конфигурациях)
  • поддержки Intl

Следствие:

  • устаревшие окружения могут давать некорректные DST-правила
  • сервер и клиент могут различаться при разных версиях ICU