Работа с границами недели в JavaScript часто требует учёта локальных стандартов: неделя может начинаться с понедельника или воскресенья, а в некоторых системах используется ISO-неделя, где неделя всегда начинается с понедельника и соответствует международному стандарту.
Библиотека date-fns предоставляет набор функций для
вычисления начала и конца недели:
startOfWeek(date, options)endOfWeek(date, options)startOfISOWeek(date)endOfISOWeek(date)Функция определения начала недели возвращает дату, установленную на 00:00:00 первого дня недели:
import { startOfWeek } from 'date-fns';
startOfWeek(new Date(2026, 0, 15));
По умолчанию неделя считается начинающейся с воскресенья (0-й день недели в JavaScript-логике). Это поведение может отличаться в зависимости от локали и переданных параметров.
Конец недели определяется аналогично, но устанавливается на 23:59:59.999 последнего дня:
import { endOfWeek } from 'date-fns';
endOfWeek(new Date(2026, 0, 15));
Ключевым параметром является weekStartsOn, позволяющий
задать первый день недели:
import { startOfWeek } from 'date-fns';
startOfWeek(new Date(2026, 0, 15), { weekStartsOn: 1 });
Значения:
Это позволяет адаптировать расчёты под локальные стандарты календаря.
ISO-8601 определяет неделю строго с понедельника. Для этого в
date-fns предусмотрены отдельные функции:
import { startOfISOWeek } from 'date-fns';
startOfISOWeek(new Date(2026, 0, 15));
Аналогично:
import { endOfISOWeek } from 'date-fns';
ISO-неделя особенно важна в финансовых и аналитических системах, где требуется единая международная логика календаря.
Работа с месяцами в date-fns реализуется через:
startOfMonth(date)endOfMonth(date)Функция устанавливает дату на первое число месяца с обнулением времени:
import { startOfMonth } from 'date-fns';
startOfMonth(new Date(2026, 4, 22));
Результат всегда соответствует:
Функция возвращает последний момент последнего дня месяца:
import { endOfMonth } from 'date-fns';
endOfMonth(new Date(2026, 4, 22));
Особенность заключается в автоматическом учёте количества дней в месяце, включая високосные годы для февраля.
Границы месяца часто используются для:
При этом важно учитывать, что результат всегда нормализуется до локального времени окружения, в котором выполняется код.
Для работы с годовыми интервалами используются функции:
startOfYear(date)endOfYear(date)import { startOfYear } from 'date-fns';
startOfYear(new Date(2026, 6, 10));
Результат фиксируется на:
import { endOfYear } from 'date-fns';
endOfYear(new Date(2026, 6, 10));
Функция возвращает:
Годовые границы используются в аналитике высокого уровня:
Важной особенностью является независимость от месяца и дня входной даты: любая дата внутри года приводит к одному и тому же результату для начала и конца года.
Функции date-fns для начала и конца периодов следуют
единому принципу:
| Период | Начало | Конец |
|---|---|---|
| Неделя | startOfWeek | endOfWeek |
| ISO-неделя | startOfISOWeek | endOfISOWeek |
| Месяц | startOfMonth | endOfMonth |
| Год | startOfYear | endOfYear |
Общая логика:
Хотя date-fns не управляет временными зонами напрямую,
поведение границ периодов зависит от локального времени выполнения
JavaScript.
При использовании серверных сред или систем с различными таймзонами возникают особенности:
Для строгой унификации часто комбинируется date-fns с
date-fns-tz, где расчёты переводятся в фиксированную
временную зону.
Границы периодов часто используются совместно для построения диапазонов:
import { startOfMonth, endOfMonth } from 'date-fns';
const range = {
start: startOfMonth(new Date()),
end: endOfMonth(new Date())
};
Аналогично строятся диапазоны:
Такой подход применяется в фильтрации массивов данных, SQL-запросах и построении API-параметров.
При преобразовании даты в строку (например, JSON) возможна потеря информации о локальном смещении, что приводит к смещению границ периода.
Отсутствие явного указания начала недели приводит к различиям между средами выполнения:
Смешивание ISO-недель и локальных недель приводит к расхождению отчётных периодов.
Границы периодов часто комбинируются с функциями:
isWithinIntervaldifferenceInDayseachDayOfIntervalПример логики фильтрации:
import { startOfMonth, endOfMonth, isWithinInterval } from 'date-fns';
const interval = {
start: startOfMonth(new Date()),
end: endOfMonth(new Date())
};
const result = data.filter(item =>
isWithinInterval(new Date(item.date), interval)
);
Такая комбинация формирует основу временной фильтрации в прикладных системах.
Все функции startOf* и endOf* приводят дату
к строго определённому состоянию:
Это делает результаты предсказуемыми при повторных вычислениях, независимо от входного времени внутри периода.