Метод startOf(unit) в Luxon используется для
нормализации момента времени к началу указанного временного интервала.
Он возвращает новый объект DateTime, в котором все меньшие
компоненты даты и времени обнулены в соответствии с выбранной единицей
измерения. Оригинальный объект при этом не изменяется, поскольку
DateTime в Luxon является иммутабельным.
startOf выполняет «срез» времени по заданной
единице:
Обобщённо: все более мелкие компоненты обнуляются, более крупные сохраняются.
Сигнатура:
DateTime.startOf(unit: string): DateTime
Параметр unit задаёт уровень округления.
Luxon поддерживает широкий набор значений unit,
включая:
"year""quarter""month""week""day""hour""minute""second""millisecond"Каждая единица влияет на набор полей, которые будут сброшены.
Наиболее частое применение связано с нормализацией даты до начала суток:
const dt = DateTime.local(2026, 5, 23, 18, 45);
const start = dt.startOf("day");
Результат:
Это удобно для группировки событий по дням или построения диапазонов.
const dt = DateTime.local(2026, 5, 23, 18, 45);
const start = dt.startOf("month");
Результат:
Все дни месяца «схлопываются» к первому дню.
const dt = DateTime.local(2026, 5, 23);
const start = dt.startOf("year");
Результат:
Используется для построения годовых диапазонов, отчетности и агрегации.
При более мелких единицах метод работает аналогично:
const dt = DateTime.local(2026, 5, 23, 18, 45, 33, 123);
dt.startOf("hour"); // 18:00:00.000
dt.startOf("minute"); // 18:45:00.000
dt.startOf("second"); // 18:45:33.000
Каждый уровень сбрасывает только нижестоящие компоненты.
Особое поведение наблюдается для "week". Начало недели
зависит от локали и настроек календаря.
В Luxon неделя определяется через локализацию, в частности:
Пример:
const dt = DateTime.local(2026, 5, 23);
const start = dt.startOf("week");
Результат зависит от конфигурации locale и календарных
настроек. В большинстве европейских локалей неделя начинается с
понедельника, в некоторых — с воскресенья.
Это критически важно при построении календарных сеток и недельной агрегации данных.
dt.startOf("quarter");
Кварталы определяются стандартно:
Метод возвращает первый день квартала в 00:00:00.000.
Любое применение startOf не изменяет исходный
объект:
const original = DateTime.local(2026, 5, 23, 18, 45);
const normalized = original.startOf("day");
После выполнения:
original сохраняет исходное значениеnormalized содержит обнулённое времяЭто позволяет безопасно строить цепочки трансформаций без побочных эффектов.
Метод часто применяется в композиции с другими операциями:
const result = DateTime.local()
.plus({ days: 3 })
.startOf("day")
.minus({ hours: 5 });
Порядок операций имеет значение:
startOf работает в контексте текущего часового пояса
объекта DateTime.
const dt = DateTime.now().setZone("Europe/Paris");
const start = dt.startOf("day");
Результат будет соответствовать полуночи именно в указанной зоне.
Важно учитывать переходы на летнее и зимнее время:
В дни смены времени:
startOf("day") возвращает корректный локальный момент,
даже если он не совпадает с UTC-границейПри передаче неподдерживаемого значения:
dt.startOf("century");
поведение зависит от версии, но обычно приводит к ошибке диапазона
(RangeError) или возвращению невалидного
DateTime. Использование строго ограниченного набора единиц
считается обязательным.
startOf не выполняет математическое округление в
привычном смысле. Он не анализирует «ближе к началу или концу», а всегда
сдвигает вниз:
"hour""day"Это делает метод детерминированным и удобным для построения диапазонов.
const start = DateTime.local().startOf("month");
const end = DateTime.local().endOf("month");
Используется для выборок данных из базы по диапазону месяца.
const key = eventDate.startOf("day").toISODate();
Позволяет агрегировать события по ключу даты без времени.
const firstVisible = month.startOf("month").startOf("week");
Часто используется для построения сеток календаря, где отображаются неполные недели.
dt.startOf("millisecond");
Фактически возвращает тот же момент времени, но в нормализованной форме объекта. Полезность этого режима минимальна, однако он присутствует для симметрии API.
Метод часто используется совместно с endOf(unit):
startOf("day") → начало сутокendOf("day") → конец сутокВместе они формируют строгие диапазоны включительно-исключающего типа или инклюзивного интервала в зависимости от логики приложения.
При создании из ISO:
DateTime.fromISO("2026-05-23T18:45:00")
startOf работает одинаково, независимо от источника
данных (ISO, JS Date, timestamp). Все преобразуется к единой внутренней
модели Luxon перед применением операции.
Локаль влияет главным образом на:
Пример:
DateTime.local().setLocale("en-gb").startOf("week");
и
DateTime.local().setLocale("en-us").startOf("week");
могут давать разные результаты при одном и том же календарном дне.
startOf в Luxon представляет собой механизм приведения
времени к нижней границе выбранного временного интервала с учётом:
и при этом сохраняет неизменяемость исходного значения, обеспечивая предсказуемость в цепочках преобразований и вычислений временных диапазонов.