В работе с датами в JavaScript часто возникает необходимость привести момент времени к границам суток: началу или концу дня. Это требуется при фильтрации записей по дате, построении диапазонов, агрегации событий, работе с календарями и аналитикой.
В библиотеке date-fns для этих задач предусмотрены функции
startOfDay и endOfDay, обеспечивающие
предсказуемое и неизменяемое преобразование объектов
Date.
Функция startOfDay возвращает новый объект
Date, установленный на 00:00:00.000
указанного дня.
startOfDay(date: Date | number): Date
date — исходная дата (объект Date или
timestamp)DatestartOfDay обнуляет все временные компоненты:
При этом календарная дата сохраняется без изменений.
import { startOfDay } from 'date-fns';
const date = new Date('2026-05-22T15:45:30.500');
const result = startOfDay(date);
console.log(result.toISOString());
// 2026-05-22T00:00:00.000Z (в UTC-отображении)
DateФункция endOfDay устанавливает время на
23:59:59.999, что соответствует последнему возможному
моменту дня в пределах миллисекундной точности JavaScript.
endOfDay(date: Date | number): Date
date — исходная датаDateendOfDay устанавливает максимальные значения времени в
пределах суток:
import { endOfDay } from 'date-fns';
const date = new Date('2026-05-22T08:10:00');
const result = endOfDay(date);
console.log(result.toISOString());
// 2026-05-22T23:59:59.999Z (в UTC-отображении)
Наиболее частый сценарий — формирование диапазона суток для фильтрации данных.
import { startOfDay, endOfDay } from 'date-fns';
const targetDate = new Date('2026-05-22T12:00:00');
const start = startOfDay(targetDate);
const end = endOfDay(targetDate);
const events = [
{ name: 'A', date: new Date('2026-05-22T01:00:00') },
{ name: 'B', date: new Date('2026-05-22T23:00:00') },
{ name: 'C', date: new Date('2026-05-23T00:00:00') }
];
const filtered = events.filter(e =>
e.date >= start && e.date <= end
);
В результате останутся только события внутри одного календарного дня.
JavaScript Date всегда хранит время в UTC, но
отображение зависит от локальной временной зоны.
startOfDay устанавливает 00:00 в локальной зонеtoISOString() время может смещаться в
UTCЕсли локальная зона UTC+3:
const d = new Date('2026-05-22T00:00:00');
startOfDay(d).toISOString();
Результат может выглядеть как:
2026-05-21T21:00:00.000Z
Это не ошибка, а следствие преобразования локального времени в UTC.
Обе функции поддерживают передачу времени в виде числового значения:
import { startOfDay } from 'date-fns';
const timestamp = 1789833600000;
const result = startOfDay(timestamp);
console.log(result);
Это упрощает работу с данными из API и баз данных, где даты часто представлены Unix-временем.
startOfDay и endOfDay:
Dateconst original = new Date('2026-05-22T10:00:00');
const result = startOfDay(original);
console.log(original.toISOString());
console.log(result.toISOString());
Оригинальная дата остаётся неизменной.
const dayKey = startOfDay(item.date).getTime();
const isSameDay = (a, b) =>
startOfDay(a).getTime() === startOfDay(b).getTime();
const range = {
from: startOfDay(new Date()),
to: endOfDay(new Date())
};
При работе с временными данными важно учитывать:
endOfDay всегда вычисляется как максимально возможное
локальное время суток, а не фиксированное UTC-значение.
startOfDay и endOfDay часто используются
совместно с:
isWithinIntervalformataddDayssubDaysПример:
import { isWithinInterval, startOfDay, endOfDay } from 'date-fns';
const date = new Date('2026-05-22T14:00:00');
const result = isWithinInterval(date, {
start: startOfDay(date),
end: endOfDay(date)
});
Обе функции:
Аналог без библиотеки:
date.setHours(0, 0, 0, 0);
Недостатки ручного подхода:
startOfDay и endOfDay устраняют эти
проблемы за счёт неизменяемого подхода и явного намерения кода.