В Luxon свойство isInDST отражает, находится ли конкретный момент времени в зоне летнего времени (Daylight Saving Time, DST) для заданной временной зоны. Это вычисляемое логическое значение, зависящее не от самого времени как такового, а от правил часового пояса, применённых к данному моменту.
Летнее время представляет собой сезонное смещение часов вперёд, применяемое в ряде регионов для экономии энергии и более рационального использования светового дня. Важный момент: DST не является универсальным — он определяется политикой конкретной временной зоны (IANA time zone database), например:
Europe/Berlin — использует DSTEurope/Moscow — не использует DSTAsia/Almaty — не использует DST в современных
правилахLuxon опирается на IANA-зоны через Intl API, поэтому
поведение 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 (если лето)
Один и тот же момент времени может одновременно:
Luxon использует системный Intl.DateTimeFormat для
определения:
Если текущий offset отличается от стандартного для данной зоны, Luxon трактует момент как DST.
Упрощённо:
Наибольшее значение isInDST имеет в дни перехода на
летнее и зимнее время.
Обычно происходит пропуск одного часа:
В этот период:
isInDST начинает возвращать true сразу
после переходаconst dt = DateTime.fromISO("2024-03-31T03:30", { zone: "Europe/Berlin" });
console.log(dt.isInDST); // true
Происходит повторение одного часа:
В этот период:
isInDST различает их через offsetconst dt = DateTime.fromISO("2024-10-27T02:30", { zone: "Europe/Berlin" });
console.log(dt.isInDST);
Значение может быть true или false в
зависимости от того, к какой части «двойного часа» относится момент.
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 не
используетсяЧастая ошибка — попытка заменить isInDST проверкой
смещения:
dt.offset > 0
Это некорректно, так как:
Правильный способ — использовать:
dt.isInDST
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;
}
Важно учитывать:
isInDST вычисляется динамически при создании
объектаsetZone пересчитывает
значениеDateTime гарантирует
консистентностьconst dt1 = DateTime.now();
const dt2 = dt1.setZone("Europe/Paris");
console.log(dt1.isInDST);
console.log(dt2.isInDST);
Luxon не хранит собственную базу правил DST. Он зависит от:
IntlСледствие: