Функция 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 не определяет количество полных
семидневных интервалов. Вместо этого вычисляется число календарных
недель, затронутых месяцем.
Например:
Это зависит от:
Пн Вт Ср Чт Пт Сб Вс
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 календарных недель.
Пн Вт Ср Чт Пт Сб Вс
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 недель, если:
Пример:
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}`)
const calendarHeight = weeks * 80
Количество недель может использоваться для:
eachWeekOfIntervalgetWeeksInMonth часто применяется вместе с
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)
startOfWeekimport {
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)
)
})
Неправильно:
getWeeksInMonth('2025-01-01')
Правильно:
getWeeksInMonth(new Date(2025, 0, 1))
weekStartsOnНеправильно:
getWeeksInMonth(date, {
weekStartsOn: 7
})
Допустимы только значения от 0 до 6.
getWeeksInMonth не вычисляет:
days / 7
Функция работает именно с календарными неделями.
Упрощённо алгоритм выглядит так:
Функция:
Date-fns придерживается функционального подхода.
Исходная дата не изменяется:
import { getWeeksInMonth } from 'date-fns'
const original = new Date(2025, 0, 1)
const result = getWeeksInMonth(original)
console.log(original)
console.log(result)
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>
)
}
import { getWeeksInMonth } from 'date-fns'
const weeks = getWeeksInMonth(
new Date(),
{
weekStartsOn: 1
}
)
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)
Февраль високосного года также может занимать:
getWeeksInMonth(
new Date(2026, 1, 1),
{
weekStartsOn: 0
}
)
getWeeksInMonth(
new Date(2025, 4, 1),
{
weekStartsOn: 1
}
)
getWeeksInMonth активно применяется в:
| Особенность | Описание |
|---|---|
| Иммутабельность | Исходные даты не изменяются |
| Поддержка локалей | Да |
| Настройка начала недели | Да |
| Возвращаемый тип | number |
| Подходит для UI | Да |
| Подходит для SSR | Да |
| Работает в Node.js | Да |
| Работает в браузере | Да |