Работа с компонентами времени в Luxon строится вокруг четырёх базовых
единиц: часов, минут, секунд и миллисекунд. Эти значения представлены
как часть объекта DateTime, а также как элементы
Duration, что позволяет управлять временем как в
абсолютной, так и в относительной форме.
В основе модели лежит идея неизменяемости: любое преобразование времени не изменяет исходный объект, а возвращает новый экземпляр с пересчитанными значениями.
DateTimeОбъект DateTime содержит доступ к компонентам времени
через свойства:
hour — часы (0–23)minute — минуты (0–59)second — секунды (0–59)millisecond — миллисекунды (0–999)import { DateTime } from "luxon";
const dt = DateTime.local(2026, 5, 23, 14, 35, 48, 123);
dt.hour; // 14
dt.minute; // 35
dt.second; // 48
dt.millisecond; // 123
Эти значения всегда соответствуют локальному или заданному часовому
поясу (zone), что делает их зависимыми от контекста
объекта.
Изменение времени выполняется через методы set и
reconfigure-подобные операции, где создаётся новый
экземпляр DateTime.
setconst base = DateTime.local(2026, 5, 23, 10, 0, 0);
const upd ated = base.se t({
hour: 18,
minute: 45,
second: 30,
millisecond: 500
});
Каждое поле может быть изменено независимо. Отсутствующие поля сохраняют прежние значения.
Особенность: значения автоматически нормализуются при выходе за допустимые диапазоны.
const dt = DateTime.local(2026, 5, 23, 10, 0, 0);
const normalized = dt.set({
minute: 120
});
// результат: +2 часа, 0 минут
normalized.hour; // 12
normalized.minute; // 0
Luxon предоставляет методы plus и minus,
которые работают с компонентами времени как с дельтами.
const dt = DateTime.local(2026, 5, 23, 10, 15, 30);
const result = dt.plus({
hours: 2,
minutes: 30,
seconds: 10,
milliseconds: 250
});
Каждая единица добавляется каскадно:
const dt = DateTime.local(2026, 5, 23, 10, 15, 30);
const result = dt.minus({
hours: 1,
minutes: 20,
seconds: 5
});
При вычитании действует та же система переноса, но в обратном направлении.
Любая операция, связанная с компонентами времени, приводит к нормализации.
const dt = DateTime.local(2026, 5, 23, 10, 0, 50);
const result = dt.plus({ seconds: 75 });
Результат:
Итог:
startOfМетод startOf позволяет привести время к началу
выбранной единицы.
const dt = DateTime.local(2026, 5, 23, 14, 37, 52, 789);
dt.startOf("hour");
Результат:
Аналогично:
dt.startOf("minute"); // seconds и milliseconds = 0
dt.startOf("second"); // milliseconds = 0
endOfПротивоположная операция — установка времени в конец единицы.
dt.endOf("hour");
Результат:
Это часто используется при построении диапазонов времени.
Миллисекунда является минимальной единицей в DateTime,
но в Duration возможны и более крупные комбинации.
const dt = DateTime.local(2026, 5, 23, 10, 0, 0);
const precise = dt.plus({ milliseconds: 1 });
При высокой частоте операций важно учитывать, что JavaScript таймеры и системное время могут не гарантировать абсолютную точность на уровне 1–10 мс.
Duration и компоненты времениDuration представляет время как интервал, а не как
момент.
import { Duration } from "luxon";
const dur = Duration.fromObject({
hours: 1,
minutes: 30,
seconds: 15,
milliseconds: 500
});
Доступ к компонентам:
dur.hours; // 1
dur.minutes; // 30
dur.seconds; // 15
dur.milliseconds; // 500
DurationКак и DateTime, длительности нормализуются:
const dur = Duration.fromObject({
seconds: 90
});
Результат:
DateTime и DurationDateTime в
Durationconst dt = DateTime.local(2026, 5, 23, 14, 20, 10, 250);
const dur = dt.diff(DateTime.local(2026, 5, 23, 0, 0, 0, 0));
Результат содержит:
Duration
к DateTimeconst dt = DateTime.local(2026, 5, 23, 10, 0, 0);
const result = dt.plus(Duration.fromObject({
hours: 3,
minutes: 15,
seconds: 40
}));
Хотя прямые свойства предпочтительнее, часто используется форматирование:
const dt = DateTime.local(2026, 5, 23, 9, 5, 3, 7);
dt.toFormat("HH:mm:ss.SSS");
Результат:
09:05:03.007
Компоненты времени зависят от зоны:
const dt = DateTime.fromObject(
{ hour: 10, minute: 0 },
{ zone: "Europe/Paris" }
);
При смене зоны:
dt.setZone("UTC");
значения hour, minute, second,
millisecond могут измениться, хотя абсолютный момент
времени остаётся тем же.
При добавлении часов возможен переход на следующий день:
const dt = DateTime.local(2026, 5, 23, 23, 0, 0);
const result = dt.plus({ hours: 2 });
Результат:
millisecond — минимальная доступная единицаDateПомимо plus и minus, возможно точечное
изменение:
const dt = DateTime.local();
const upd ated = dt.se t({
second: dt.second + 10
});
Однако такой подход менее предпочтителен из-за необходимости ручной нормализации.
Компоненты времени всегда связаны:
Эта связь обеспечивает целостность времени и исключает рассинхронизацию значений внутри объекта.