В библиотеке Luxon период времени обычно выражается через два ключевых состояния: начало и конец. Эти границы определяют интервал существования даты или набора дат и используются для календарных вычислений, фильтрации, агрегации и построения временных диапазонов.
Базовая модель работы строится вокруг объекта DateTime,
который представляет конкретный момент времени с учётом часового пояса,
локали и календарных правил. Период в этом контексте — это производная
конструкция, формируемая через:
Interval)startOf,
endOf)Метод startOf нормализует момент времени до начала
указанной временной единицы. Он обнуляет более мелкие компоненты даты,
сохраняя более крупные.
DateTime.startOf(unit: string): DateTime
Поддерживаемые единицы включают:
yearmonthweekdayhourminutesecondmillisecondconst dt = DateTime.local(2026, 5, 23, 14, 45);
const start = dt.startOf('day');
Результат фиксирует время на 00:00:00.000 текущего
дня.
const startMonth = dt.startOf('month');
Обнуляется день, время и все меньшие единицы, устанавливая дату на первое число месяца.
const startYear = dt.startOf('year');
Дата нормализуется к 1 января текущего года с нулевым временем.
const startWeek = dt.startOf('week');
Неделя зависит от локали. В некоторых конфигурациях началом считается понедельник, в других — воскресенье. Luxon использует ICU-календарь, поэтому результат зависит от настроек локали окружения.
Метод endOf выполняет противоположную операцию: он
расширяет момент времени до последнего возможного значения указанной
единицы.
DateTime.endOf(unit: string): DateTime
const end = dt.endOf('day');
Результат устанавливает время на:
23:59:59.999
const endMonth = dt.endOf('month');
Количество дней учитывается автоматически, включая високосные годы и различную длину месяцев.
const endYear = dt.endOf('year');
Фиксируется 31 декабря 23:59:59.999 текущего года.
Обе операции симметричны и часто применяются совместно для построения диапазонов.
const start = dt.startOf('day');
const end = dt.endOf('day');
Такой подход формирует полный календарный день как временной диапазон.
Luxon предоставляет отдельную структуру Interval,
которая превращает пару дат в полноценный объект периода.
const interval = Interval.fromDateTimes(
dt.startOf('day'),
dt.endOf('day')
);
Interval поддерживает:
interval.contains(DateTime.local());
Метод определяет, принадлежит ли момент времени заданному интервалу.
interval.overlaps(otherInterval);
Используется при работе с календарями, расписаниями и временными окнами.
Каждая единица времени имеет фиксированную иерархию:
При вызове startOf или endOf происходит
каскадное обнуление или заполнение всех нижестоящих уровней.
Luxon строго учитывает часовой пояс объекта DateTime.
Это влияет на вычисление начала и конца периода, особенно при переходах
между зонами.
const dt = DateTime.fromISO('2026-03-29T10:00:00', { zone: 'Europe/Berlin' });
При вызове:
dt.startOf('day');
результат будет зависеть от локального времени зоны, а не UTC.
При DST (Daylight Saving Time) некоторые дни могут:
Luxon корректно адаптирует startOf('day') и
endOf('day'), избегая несуществующих локальных времён.
Luxon допускает применение startOf и endOf
к различным уровням детализации, что позволяет строить гибкие временные
диапазоны.
dt.startOf('hour')
dt.endOf('hour')
Формирует интервал внутри одного часа с точностью до миллисекунд.
dt.startOf('minute')
dt.endOf('minute')
Используется в системах логирования и потоковой обработки событий.
Операции начала и конца периода часто применяются для группировки событий.
const start = dt.startOf('day');
const end = dt.endOf('day');
events.filter(e =>
Interval.fromDateTimes(start, end).contains(e.time)
);
Luxon работает с миллисекундной точностью. Это означает, что:
endOf('day') всегда заканчивается на
999 msОсобое значение имеет включительность границ в Interval,
где начало включается, а конец — нет.
Luxon использует ICU-календарь, поэтому:
Это напрямую влияет на результат startOf('week').
Методы поддерживают цепочное использование через
DateTime:
const result = DateTime.local()
.startOf('month')
.plus({ days: 10 })
.endOf('day');
Такие цепочки применяются для вычисления относительных периодов внутри уже нормализованных границ.
При работе с пользовательским вводом даты часто требуется приведение к стандартным границам:
Это обеспечивает стабильность при сравнении и хранении данных в базах, где временные диапазоны должны быть детерминированными и независимыми от формата ввода.