Определение последнего дня периода

Работа с датами почти всегда связана с вычислением границ временных интервалов: конца недели, месяца, квартала или года. Библиотека date-fns предоставляет набор функций, позволяющих безопасно и удобно находить последние дни различных периодов без ручных вычислений.


Последний день месяца: lastDayOfMonth

Функция lastDayOfMonth возвращает объект Date, представляющий последний день месяца для переданной даты.

Синтаксис

import { lastDayOfMonth } from 'date-fns'

const result = lastDayOfMonth(date)

Пример

import { lastDayOfMonth } from 'date-fns'

const date = new Date(2025, 0, 10)

const result = lastDayOfMonth(date)

console.log(result)

Результат:

2025-01-31T00:00:00.000Z

Как работает функция

Если передана любая дата января 2025 года, функция автоматически определяет:

  • количество дней в месяце;
  • високосность года;
  • корректную конечную дату.

Это избавляет от необходимости вручную проверять:

if (month === 1 && leapYear) {
  // февраль
}

Определение конца февраля

Особенно полезна функция при работе с февралём.

Невисокосный год

import { lastDayOfMonth } from 'date-fns'

const result = lastDayOfMonth(new Date(2025, 1, 5))

console.log(result)

Результат:

2025-02-28T00:00:00.000Z

Високосный год

import { lastDayOfMonth } from 'date-fns'

const result = lastDayOfMonth(new Date(2024, 1, 5))

console.log(result)

Результат:

2024-02-29T00:00:00.000Z

Последний день недели: lastDayOfWeek

Функция lastDayOfWeek вычисляет конец недели.

Базовый пример

import { lastDayOfWeek } from 'date-fns'

const date = new Date(2025, 4, 12)

const result = lastDayOfWeek(date)

console.log(result)

По умолчанию конец недели зависит от региональных настроек.


Настройка начала недели

В JavaScript-проектах часто требуется явно задавать:

  • понедельник как начало недели;
  • воскресенье как начало недели.

Для этого используется параметр weekStartsOn.

Неделя начинается с понедельника

import { lastDayOfWeek } from 'date-fns'

const result = lastDayOfWeek(
  new Date(2025, 4, 12),
  {
    weekStartsOn: 1
  }
)

console.log(result)

Значения:

Значение День
0 воскресенье
1 понедельник
2 вторник
3 среда
4 четверг
5 пятница
6 суббота

Последний день квартала: lastDayOfQuarter

Кварталы активно используются в:

  • финансовых системах;
  • аналитике;
  • бухгалтерии;
  • отчётности.

Пример

import { lastDayOfQuarter } from 'date-fns'

const result = lastDayOfQuarter(
  new Date(2025, 3, 18)
)

console.log(result)

Результат:

2025-06-30T00:00:00.000Z

Границы кварталов

Квартал Последний день
Q1 31 марта
Q2 30 июня
Q3 30 сентября
Q4 31 декабря

Последний день года: lastDayOfYear

Функция возвращает 31 декабря соответствующего года.

Пример

import { lastDayOfYear } from 'date-fns'

const result = lastDayOfYear(
  new Date(2025, 6, 10)
)

console.log(result)

Результат:

2025-12-31T00:00:00.000Z

Последний день декады

В библиотеке отсутствует встроенная функция для декад, однако Date-fns удобно комбинируется с обычной логикой JavaScript.

Пример вычисления

function getLastDayOfDecade(date) {
  const day = date.getDate()

  if (day <= 10) {
    return 10
  }

  if (day <= 20) {
    return 20
  }

  return new Date(
    date.getFullYear(),
    date.getMonth() + 1,
    0
  ).getDate()
}

Использование

const result = getLastDayOfDecade(
  new Date(2025, 0, 27)
)

console.log(result)

Результат:

31

Последний день ISO-недели: lastDayOfISOWeek

ISO-стандарт определяет:

  • понедельник как начало недели;
  • воскресенье как конец недели.

Пример

import { lastDayOfISOWeek } from 'date-fns'

const result = lastDayOfISOWeek(
  new Date(2025, 4, 12)
)

console.log(result)

Разница между endOfMonth и lastDayOfMonth

Date-fns содержит две похожие функции:

Функция Что возвращает
lastDayOfMonth Последний день в 00:00
endOfMonth Последний момент месяца

Сравнение

import {
  lastDayOfMonth,
  endOfMonth
} from 'date-fns'

const date = new Date(2025, 0, 15)

console.log(lastDayOfMonth(date))
console.log(endOfMonth(date))

Результат:

2025-01-31T00:00:00.000Z
2025-01-31T23:59:59.999Z

Использование в отчётных системах

Определение последнего дня периода часто применяется при:

  • формировании отчётов;
  • фильтрации данных;
  • построении графиков;
  • выгрузке статистики;
  • расчёте зарплат;
  • генерации налоговых периодов.

Пример фильтрации

import {
  startOfMonth,
  endOfMonth
} from 'date-fns'

const start = startOfMonth(new Date())
const end = endOfMonth(new Date())

console.log(start)
console.log(end)

Построение диапазонов дат

Функции определения конца периода обычно комбинируются с функциями начала периода.

Пример диапазона квартала

import {
  startOfQuarter,
  endOfQuarter
} from 'date-fns'

const now = new Date()

const start = startOfQuarter(now)
const end = endOfQuarter(now)

console.log(start)
console.log(end)

Проверка попадания даты в период

После вычисления конца периода удобно использовать функцию isWithinInterval.

Пример

import {
  startOfMonth,
  endOfMonth,
  isWithinInterval
} from 'date-fns'

const target = new Date(2025, 0, 15)

const result = isWithinInterval(target, {
  start: startOfMonth(target),
  end: endOfMonth(target)
})

console.log(result)

Работа с часовыми поясами

Функции Date-fns работают с локальным часовым поясом среды выполнения.

Это означает, что результат зависит от:

  • браузера;
  • сервера Node.js;
  • системного времени.

Возможная проблема

const result = endOfMonth(new Date())

При сериализации через:

toISOString()

дата может визуально сместиться на предыдущий день из-за UTC.


Использование с date-fns-tz

Для точной работы с часовыми поясами применяется date-fns-tz.

Пример

import { endOfDay } from 'date-fns'
import { toZonedTime } from 'date-fns-tz'

const date = new Date()

const zoned = toZonedTime(
  date,
  'Europe/Berlin'
)

console.log(endOfDay(zoned))

Иммутабельность функций

Функции Date-fns не изменяют исходный объект Date.

Пример

import { lastDayOfMonth } from 'date-fns'

const original = new Date(2025, 0, 15)

const result = lastDayOfMonth(original)

console.log(original)
console.log(result)

Исходная дата остаётся неизменной.

Это особенно важно:

  • в React-приложениях;
  • при работе с Redux;
  • в функциональном программировании;
  • в многослойной бизнес-логике.

Производительность

Date-fns использует модульную архитектуру.

Импорт отдельных функций

import { lastDayOfMonth } from 'date-fns'

Позволяет:

  • уменьшить размер бандла;
  • улучшить tree shaking;
  • ускорить загрузку приложения.

Типизация в TypeScript

Все функции библиотеки имеют качественную типизацию.

Пример

import { lastDayOfMonth } from 'date-fns'

const result: Date = lastDayOfMonth(
  new Date()
)

Практический пример: генерация периода отчёта

import {
  startOfMonth,
  endOfMonth,
  format
} from 'date-fns'

function buildReportPeriod(date) {
  const start = startOfMonth(date)
  const end = endOfMonth(date)

  return {
    start,
    end,
    label: `${format(start, 'dd.MM.yyyy')} - ${format(end, 'dd.MM.yyyy')}`
  }
}

console.log(
  buildReportPeriod(new Date())
)

Практический пример: проверка окончания подписки

import {
  lastDayOfMonth,
  isAfter
} from 'date-fns'

const subscriptionEnd = lastDayOfMonth(
  new Date(2025, 0, 1)
)

const expired = isAfter(
  new Date(),
  subscriptionEnd
)

console.log(expired)

Наиболее используемые функции конца периода

Функция Назначение
lastDayOfMonth Последний день месяца
lastDayOfWeek Последний день недели
lastDayOfISOWeek Последний день ISO-недели
lastDayOfQuarter Последний день квартала
lastDayOfYear Последний день года
endOfDay Конец дня
endOfWeek Конец недели
endOfMonth Конец месяца
endOfQuarter Конец квартала
endOfYear Конец года