lastDayOfMonth и firstDayOfMonth

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

Сигнатура

firstDayOfMonth(date)

Аргументы

Аргумент Тип Описание
date Date \| number Исходная дата

Возвращаемое значение

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


Подключение функции

CommonJS

const firstDayOfMonth = require('date-fns/firstDayOfMonth')

ES Modules

import firstDayOfMonth fr om 'date-fns/firstDayOfMonth'

Именованный импорт

import { firstDayOfMonth } from 'date-fns'

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

import { firstDayOfMonth } from 'date-fns'

const date = new Date(2026, 4, 18)

const result = firstDayOfMonth(date)

console.log(result)

Результат:

2026-05-01T00:00:00.000Z

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

Если передать любую дату месяца, функция:

  1. Определяет месяц и год.
  2. Устанавливает день в 1.
  3. Сохраняет время из исходной даты.

Пример:

const date = new Date(2025, 9, 27, 15, 45)

const result = firstDayOfMonth(date)

console.log(result)

Результат:

Wed Oct 01 2025 15:45:00

Время 15:45:00 сохраняется.


Получение начала текущего месяца

import { firstDayOfMonth } from 'date-fns'

const now = new Date()

const start = firstDayOfMonth(now)

console.log(start)

Использование с форматированием

Очень часто firstDayOfMonth применяется вместе с format.

import { firstDayOfMonth, format } from 'date-fns'

const date = new Date()

const result = firstDayOfMonth(date)

console.log(format(result, 'dd.MM.yyyy'))

Результат:

01.05.2026

Получение первого дня для календаря

import { firstDayOfMonth } from 'date-fns'

function getCalendarStart(date) {
  return firstDayOfMonth(date)
}

console.log(getCalendarStart(new Date()))

Подобная логика используется в:

  • календарях;
  • системах бронирования;
  • CRM;
  • финансовых отчётах;
  • аналитических панелях.

Работа с таймзонами

date-fns работает с локальным временем JavaScript.

const date = new Date('2026-07-19T12:00:00')

console.log(firstDayOfMonth(date))

Результат зависит от локальной временной зоны среды выполнения.


Получение первого дня предыдущего месяца

import {
  firstDayOfMonth,
  subMonths
} from 'date-fns'

const date = new Date()

const previousMonth = subMonths(date, 1)

const result = firstDayOfMonth(previousMonth)

console.log(result)

Получение первого дня следующего месяца

import {
  firstDayOfMonth,
  addMonths
} from 'date-fns'

const date = new Date()

const nextMonth = addMonths(date, 1)

const result = firstDayOfMonth(nextMonth)

console.log(result)

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

import {
  firstDayOfMonth,
  format
} from 'date-fns'

const reportDate = new Date()

const start = firstDayOfMonth(reportDate)

console.log(
  `Начало отчётного периода: ${format(start, 'yyyy-MM-dd')}`
)

Построение диапазона месяца

firstDayOfMonth часто используется вместе с lastDayOfMonth.

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

const date = new Date()

const start = firstDayOfMonth(date)
const end = lastDayOfMonth(date)

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

Проверка начала месяца

import {
  firstDayOfMonth,
  isEqual
} from 'date-fns'

const date = new Date()

const start = firstDayOfMonth(date)

console.log(isEqual(date, start))

Использование в SQL-фильтрации

import {
  firstDayOfMonth,
  format
} from 'date-fns'

const date = new Date()

const start = format(
  firstDayOfMonth(date),
  'yyyy-MM-dd'
)

const query = `
SEL ECT *
FROM orders
WH ERE created_at >= '${start}'
`

console.log(query)

lastDayOfMonth

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

Сигнатура

lastDayOfMonth(date)

Аргументы

Аргумент Тип Описание
date Date \| number Исходная дата

Возвращаемое значение

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


Подключение функции

CommonJS

const lastDayOfMonth = require('date-fns/lastDayOfMonth')

ES Modules

import lastDayOfMonth fr om 'date-fns/lastDayOfMonth'

Именованный импорт

import { lastDayOfMonth } from 'date-fns'

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

import { lastDayOfMonth } from 'date-fns'

const date = new Date(2026, 1, 10)

const result = lastDayOfMonth(date)

console.log(result)

Результат:

2026-02-28T00:00:00.000Z

Определение количества дней в месяце

Функция автоматически учитывает:

  • високосные годы;
  • различную длину месяцев;
  • переходы между годами.

Пример с високосным годом

import { lastDayOfMonth } from 'date-fns'

const date = new Date(2024, 1, 10)

console.log(lastDayOfMonth(date))

Результат:

Thu Feb 29 2024

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

Внутренне логика похожа на:

  1. Переход к следующему месяцу.
  2. Установка дня 0.
  3. Получение последнего дня предыдущего месяца.

Упрощённый аналог:

function customLastDayOfMonth(date) {
  return new Date(
    date.getFullYear(),
    date.getMonth() + 1,
    0
  )
}

Получение конца текущего месяца

import { lastDayOfMonth } from 'date-fns'

const result = lastDayOfMonth(new Date())

console.log(result)

Форматирование результата

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

const result = lastDayOfMonth(new Date())

console.log(
  format(result, 'dd.MM.yyyy')
)

Получение последнего дня для финансового периода

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

const currentDate = new Date()

const period = {
  start: firstDayOfMonth(currentDate),
  end: lastDayOfMonth(currentDate)
}

console.log(period)

Использование в фильтрации данных

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

const start = firstDayOfMonth(new Date())
const end = lastDayOfMonth(new Date())

const filteredOrders = orders.filter(order => {
  return order.date >= start &&
         order.date <= end
})

Создание диапазона за месяц

import {
  eachDayOfInterval,
  firstDayOfMonth,
  lastDayOfMonth
} from 'date-fns'

const start = firstDayOfMonth(new Date())
const end = lastDayOfMonth(new Date())

const days = eachDayOfInterval({
  start,
  end
})

console.log(days)

Использование в календарях

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

function getMonthRange(date) {
  return {
    start: firstDayOfMonth(date),
    end: lastDayOfMonth(date)
  }
}

Работа с API

import {
  firstDayOfMonth,
  lastDayOfMonth,
  formatISO
} from 'date-fns'

const start = formatISO(
  firstDayOfMonth(new Date())
)

const end = formatISO(
  lastDayOfMonth(new Date())
)

fetch('/api/statistics', {
  method: 'POST',
  body: JSON.stringify({
    start,
    end
  })
})

Получение последнего дня предыдущего месяца

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

const previousMonth = subMonths(new Date(), 1)

console.log(
  lastDayOfMonth(previousMonth)
)

Получение последнего дня следующего месяца

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

const nextMonth = addMonths(new Date(), 1)

console.log(
  lastDayOfMonth(nextMonth)
)

Комбинирование с endOfDay

lastDayOfMonth возвращает дату с сохранением времени, а не конец суток. Для получения полного окончания месяца обычно используют endOfDay.

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

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

console.log(result)

Результат:

2026-05-31T23:59:59.999

Отличие lastDayOfMonth от endOfMonth

lastDayOfMonth

Возвращает последний календарный день.

2026-05-31T00:00:00.000

endOfMonth

Возвращает конец месяца с максимальным временем суток.

2026-05-31T23:59:59.999

Сравнение

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

const date = new Date()

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

Типичные ошибки

Передача строки вместо даты

lastDayOfMonth('2026-05-10')

Хотя JavaScript может преобразовать строку автоматически, рекомендуется явно создавать объект Date.

Правильно:

lastDayOfMonth(
  new Date('2026-05-10')
)

Мутация исходной даты

date-fns не изменяет исходный объект.

const original = new Date()

const result = firstDayOfMonth(original)

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

Это важное преимущество библиотеки.


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

import {
  firstDayOfMonth,
  lastDayOfMonth,
  format
} from 'date-fns'

function generateReportPeriod(date) {
  return {
    start: format(
      firstDayOfMonth(date),
      'yyyy-MM-dd'
    ),
    end: format(
      lastDayOfMonth(date),
      'yyyy-MM-dd'
    )
  }
}

console.log(
  generateReportPeriod(new Date())
)

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

import {
  firstDayOfMonth,
  lastDayOfMonth,
  format
} from 'date-fns'

function getFormattedPeriod(date) {
  const start = firstDayOfMonth(date)
  const end = lastDayOfMonth(date)

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

console.log(
  getFormattedPeriod(new Date())
)

Практический пример: выборка данных за месяц

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

function filterTransactions(
  transactions,
  date
) {
  const start = firstDayOfMonth(date)
  const end = lastDayOfMonth(date)

  return transactions.filter(item => {
    return item.createdAt >= start &&
           item.createdAt <= end
  })
}