getWeeksInMonth

Функция getWeeksInMonth из библиотеки date-fns используется для определения количества календарных недель, пересекающихся с указанным месяцем.

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

  • дату внутри нужного месяца;
  • правила начала недели (weekStartsOn);
  • локаль (locale).

Возвращаемое значение — целое число.


Сигнатура функции

getWeeksInMonth(date, options)

Аргументы

Аргумент Описание
date Любая дата внутри нужного месяца
options Дополнительные настройки

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

import { getWeeksInMonth } from 'date-fns'

const result = getWeeksInMonth(new Date(2025, 0, 10))

console.log(result)
5

В примере вычисляется количество недель в январе 2025 года.


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

getWeeksInMonth не определяет количество полных семидневных интервалов. Вместо этого вычисляется число календарных недель, затронутых месяцем.

Например:

  • месяц может занимать 4 недели;
  • 5 недель;
  • 6 недель.

Это зависит от:

  • дня начала месяца;
  • длины месяца;
  • выбранного начала недели.

Визуальный принцип вычисления

Пример месяца на 5 недель

Пн Вт Ср Чт Пт Сб Вс
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Месяц пересекает 5 календарных недель.


Пример месяца на 6 недель

Пн Вт Ср Чт Пт Сб Вс
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Месяц затрагивает 6 недель.


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

Параметр weekStartsOn определяет день начала недели.

Значения

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

Пример с разным началом недели

import { getWeeksInMonth } from 'date-fns'

const date = new Date(2025, 1, 1)

const sundayStart = getWeeksInMonth(date, {
  weekStartsOn: 0
})

const mondayStart = getWeeksInMonth(date, {
  weekStartsOn: 1
})

console.log(sundayStart)
console.log(mondayStart)

Результат может отличаться, поскольку сетка календаря меняется.


Почему количество недель меняется

Рассмотрим условный месяц:

1 число выпадает на субботу
в месяце 31 день

Если неделя начинается с воскресенья:

Вс Пн Вт Ср Чт Пт Сб
                   1

Появляется дополнительная неделя в начале.

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

Пн Вт Ср Чт Пт Сб Вс
                1  2

Структура календаря уже другая.


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

Функция поддерживает локализацию через параметр locale.

import { getWeeksInMonth } from 'date-fns'
import { ru } from 'date-fns/locale'

const result = getWeeksInMonth(
  new Date(2025, 0, 1),
  {
    locale: ru
  }
)

console.log(result)

Локаль влияет на:

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

Комбинация locale и weekStartsOn

Если одновременно передать locale и weekStartsOn, приоритет получает weekStartsOn.

import { getWeeksInMonth } from 'date-fns'
import { ru } from 'date-fns/locale'

const result = getWeeksInMonth(
  new Date(2025, 0, 1),
  {
    locale: ru,
    weekStartsOn: 0
  }
)

console.log(result)

Даже если локаль предполагает понедельник, функция использует воскресенье.


Тип возвращаемого значения

number

Пример:

4
5
6

Какие месяцы чаще всего дают 6 недель

Месяц обычно занимает 6 недель, если:

  • начинается ближе к концу недели;
  • содержит 31 день;
  • начало недели смещено.

Пример:

import { getWeeksInMonth } from 'date-fns'

const result = getWeeksInMonth(
  new Date(2025, 2, 1),
  {
    weekStartsOn: 1
  }
)

console.log(result)

Практическое применение

Генерация календаря

import { getWeeksInMonth } from 'date-fns'

const weeks = getWeeksInMonth(new Date())

for (let i = 0; i < weeks; i++) {
  console.log(`Неделя ${i + 1}`)
}

Построение сетки календаря

import { getWeeksInMonth } from 'date-fns'

const rows = getWeeksInMonth(
  new Date(2025, 6, 1),
  {
    weekStartsOn: 1
  }
)

console.log(`Строк календаря: ${rows}`)

Адаптивный UI календаря

const calendarHeight = weeks * 80

Количество недель может использоваться для:

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

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

getWeeksInMonth часто применяется вместе с eachWeekOfInterval.

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

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

const weeksCount = getWeeksInMonth(date)

const weeks = eachWeekOfInterval({
  start: startOfMonth(date),
  end: endOfMonth(date)
})

console.log(weeksCount)
console.log(weeks)

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

import {
  getWeeksInMonth,
  startOfWeek
} from 'date-fns'

const date = new Date()

const weeks = getWeeksInMonth(date)

const firstWeek = startOfWeek(date, {
  weekStartsOn: 1
})

console.log(weeks)
console.log(firstWeek)

Проверка разных месяцев

import { getWeeksInMonth } from 'date-fns'

const months = [
  new Date(2025, 0, 1),
  new Date(2025, 1, 1),
  new Date(2025, 2, 1),
  new Date(2025, 3, 1)
]

months.forEach(month => {
  console.log(
    month.toDateString(),
    getWeeksInMonth(month)
  )
})

Частые ошибки

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

Неправильно:

getWeeksInMonth('2025-01-01')

Правильно:

getWeeksInMonth(new Date(2025, 0, 1))

Неверный weekStartsOn

Неправильно:

getWeeksInMonth(date, {
  weekStartsOn: 7
})

Допустимы только значения от 0 до 6.


Путаница между неделями и количеством дней

getWeeksInMonth не вычисляет:

days / 7

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


Внутренний принцип работы

Упрощённо алгоритм выглядит так:

  1. Определяется начало месяца.
  2. Определяется конец месяца.
  3. Вычисляются календарные недели между ними.
  4. Возвращается итоговое количество.

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

Функция:

  • не мутирует исходную дату;
  • работает очень быстро;
  • подходит для UI-календарей;
  • безопасна для многократных вызовов.

Иммутабельность

Date-fns придерживается функционального подхода.

Исходная дата не изменяется:

import { getWeeksInMonth } from 'date-fns'

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

const result = getWeeksInMonth(original)

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

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

import { getWeeksInMonth } from 'date-fns'

function Calendar({ date }) {
  const rows = getWeeksInMonth(date)

  return (
    <div>
      {Array.from({ length: rows }).map((_, index) => (
        <div key={index}>
          Week {index + 1}
        </div>
      ))}
    </div>
  )
}

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

import { getWeeksInMonth } from 'date-fns'

const weeks = getWeeksInMonth(
  new Date(),
  {
    weekStartsOn: 1
  }
)

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

const { getWeeksInMonth } = require('date-fns')

const weeks = getWeeksInMonth(new Date())

console.log(weeks)

Сравнение с другими функциями

Функция Назначение
getWeeksInMonth Количество недель в месяце
getWeek Номер недели года
getWeekOfMonth Номер недели внутри месяца
eachWeekOfInterval Массив недель интервала
differenceInWeeks Разница в неделях

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

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

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

const weeks = getWeeksInMonth(date, {
  weekStartsOn: 1
})

const days = eachDayOfInterval({
  start: startOfMonth(date),
  end: endOfMonth(date)
})

console.log('Количество недель:', weeks)
console.log('Количество дней:', days.length)

Поведение на високосный год

import { getWeeksInMonth } from 'date-fns'

const result = getWeeksInMonth(
  new Date(2024, 1, 1)
)

console.log(result)

Февраль високосного года также может занимать:

  • 4 недели;
  • 5 недель.

Проверка крайних случаев

Месяц начинается в воскресенье

getWeeksInMonth(
  new Date(2026, 1, 1),
  {
    weekStartsOn: 0
  }
)

Месяц заканчивается в субботу

getWeeksInMonth(
  new Date(2025, 4, 1),
  {
    weekStartsOn: 1
  }
)

Когда функция особенно полезна

getWeeksInMonth активно применяется в:

  • календарях;
  • планировщиках;
  • CRM-системах;
  • booking-интерфейсах;
  • системах аналитики;
  • финансовых приложениях;
  • UI-компонентах расписаний.

Основные особенности

Особенность Описание
Иммутабельность Исходные даты не изменяются
Поддержка локалей Да
Настройка начала недели Да
Возвращаемый тип number
Подходит для UI Да
Подходит для SSR Да
Работает в Node.js Да
Работает в браузере Да