Метод endOf в библиотеке Luxon используется для
приведения объекта DateTime к последнему моменту заданного
временного интервала. Он позволяет быстро получить «конец» года, месяца,
дня, часа и других временных единиц, сохраняя при этом неизменяемость
исходного объекта.
В основе работы метода лежит концепция нормализации времени до максимально возможного значения внутри выбранной единицы измерения. Это особенно полезно при построении диапазонов дат, фильтрации данных, агрегации событий и работе с календарными интервалами.
Метод вызывается на экземпляре DateTime:
DateTime.endOf(unit: string): DateTime
unit — строка, определяющая временную единицу
("year", "month", "day",
"hour", "minute", "second",
"millisecond").DateTime, так как Luxon
строго придерживается неизменяемости (immutability).Исходный объект не изменяется.
Метод устанавливает все младшие единицы времени в максимальные значения, доступные в рамках выбранного уровня.
dt.endOf("year")
Результат:
Год полностью «закрывается» до последнего возможного момента.
dt.endOf("month")
Результат:
Количество дней учитывается автоматически, включая високосные годы и месяцы с 30/31 днем.
dt.endOf("day")
Результат:
Используется для построения дневных диапазонов.
dt.endOf("hour")
Результат:
Минуты, секунды и миллисекунды устанавливаются в максимальные значения.
dt.endOf("minute")
Результат:
dt.endOf("second")
Результат:
dt.endOf("millisecond")
Фактически возвращает тот же момент, так как более мелкой единицы нет.
Метод endOf часто используется совместно с
startOf для построения диапазонов.
const start = dt.startOf("month");
const end = dt.endOf("month");
Такой подход позволяет формировать точные интервалы:
Это базовый паттерн для фильтрации данных по диапазону дат.
При работе с массивами дат:
const start = DateTime.now().startOf("day");
const end = DateTime.now().endOf("day");
events.filter(e => {
const time = DateTime.fromISO(e.date);
return time >= start && time <= end;
});
Метод endOf("day") гарантирует включение всех событий до
последней миллисекунды суток.
const monthStart = dt.startOf("month");
const monthEnd = dt.endOf("month");
Используется в:
При группировке данных по часам:
const hourStart = dt.startOf("hour");
const hourEnd = dt.endOf("hour");
Позволяет формировать временные «бакеты» для систем мониторинга.
Luxon хранит информацию о временной зоне внутри объекта
DateTime. Метод endOf сохраняет текущую зону
без преобразования в UTC (если явно не задано).
const dt = DateTime.now().setZone("Europe/Paris");
const end = dt.endOf("day");
Результат остается в зоне Europe/Paris, но время
корректируется с учетом локальных правил зоны.
При переходе на летнее или зимнее время возможны аномалии длительности суток:
endOf("day") всегда возвращает последний валидный
момент локального дняLuxon учитывает эти изменения автоматически через встроенный IANA timezone database.
Эквивалентная логика без endOf выглядит значительно
сложнее:
dt.set({
hour: 23,
minute: 59,
second: 59,
millisecond: 999
});
Но такой подход:
endOf инкапсулирует всю логику внутри библиотеки.
Метод можно комбинировать с другими преобразованиями:
const result = DateTime.now()
.plus({ days: 2 })
.endOf("month")
.toISO();
В цепочке важно учитывать порядок операций:
endOfМетод часто применяется для ограничения верхней границы диапазона:
if (currentTime <= dt.endOf("day")) {
// попадает в текущий день
}
Это позволяет избежать ошибок, связанных с исключением последней миллисекунды.
const month = DateTime.now();
const range = {
start: month.startOf("month"),
end: month.endOf("month")
};
const hourRange = {
start: dt.startOf("hour"),
end: dt.endOf("hour")
};
const secondRange = {
start: dt.startOf("second"),
end: dt.endOf("second")
};
Luxon работает с миллисекундной точностью. Поэтому:
endOf("second") всегда добавляет .999Метод активно используется в:
endOf не округляет время произвольно, а строго
фиксирует максимальное значение внутри единицыDateTimeПосле применения endOf часто используется
форматирование:
dt.endOf("month").toFormat("yyyy-LL-dd HH:mm:ss.SSS");
Это позволяет получить человекочитаемую границу периода для логов и отчетов.