Функция getWeek из библиотеки date-fns
предназначена для вычисления номера недели в году для заданной даты. Она
учитывает правила, по которым недели распределяются внутри календарного
года, включая настройку первого дня недели и определения первой недели
года. Это делает её гибким инструментом для работы с календарными
системами, отличными от ISO-стандарта.
В разных системах календарей неделя может начинаться с разных дней (понедельник или воскресенье), а первая неделя года может определяться по различным правилам:
getWeek реализует настраиваемую модель,
где поведение зависит от параметров options.
getWeek(date, options)
Параметры:
date — дата, для которой вычисляется номер неделиoptions — объект конфигурации (необязательный)Основные поля options:
{
weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6,
firstWeekContainsDate: number
}
weekStartsOnОпределяет день, с которого начинается неделя:
| Значение | День недели |
|---|---|
| 0 | воскресенье |
| 1 | понедельник |
| 2 | вторник |
| … | … |
| 6 | суббота |
Ключевая особенность: изменение этого параметра полностью влияет на разбиение календаря на недели.
firstWeekContainsDateОпределяет правило первой недели года. Значение — день января, который должен попасть в первую неделю года.
Примеры:
1 — первая неделя содержит 1 января4 — первая неделя содержит минимум 4 дня нового года
(часто используется в европейских системах)7 — первая неделя начинается только после первой полной
неделиimport { getWeek } from 'date-fns'
getWeek(new Date(2024, 0, 1))
Результат зависит от настроек по умолчанию:
import { getWeek } from 'date-fns'
const date = new Date(2024, 0, 10)
getWeek(date, { weekStartsOn: 1 })
В этом случае:
firstWeekContainsDateimport { getWeek } from 'date-fns'
const date = new Date(2024, 0, 10)
getWeek(date, {
weekStartsOn: 1,
firstWeekContainsDate: 4
})
Такая конфигурация соответствует логике, близкой к ISO-нумерации недель, но не идентичной ей.
getWeek от
getISOWeekgetWeek и getISOWeek часто используются для
похожих задач, но их поведение различается.
getISOWeekimport { getISOWeek } from 'date-fns'
getWeekimport { getWeek, getISOWeek } from 'date-fns'
const date = new Date(2024, 0, 1)
getWeek(date, { weekStartsOn: 0 })
getISOWeek(date)
Для одной и той же даты результаты могут различаться из-за разных календарных правил.
Алгоритм внутри getWeek включает:
weekStartsOnconst weekNumber = getWeek(selectedDate, {
weekStartsOn: 1
})
Используется для отображения номера недели рядом с датой в UI.
import { getWeek } from 'date-fns'
const grouped = {}
events.forEach(event => {
const week = getWeek(event.date, { weekStartsOn: 1 })
if (!grouped[week]) {
grouped[week] = []
}
grouped[week].push(event)
})
Результат — структура данных, сгруппированная по неделям года.
При построении отчётов часто требуется агрегация:
const weekIndex = getWeek(transaction.date, {
weekStartsOn: 1,
firstWeekContainsDate: 4
})
Хотя getWeek не принимает локаль напрямую, поведение
часто синхронизируют с локалями через date-fns/locale.
Пример интеграции через вспомогательные функции:
weekStartsOnЭто позволяет строить календарные системы для разных стран.
Дата в конце декабря может попасть в первую неделю следующего года:
getWeek(new Date(2023, 11, 31))
или наоборот — январские дни могут принадлежать последней неделе предыдущего года.
Одна и та же дата может иметь разные номера недель:
weekStartsOngetWeek(date)
Результат может не совпадать с ожиданиями при работе с локальными календарями.
Если:
weekStartsOnвозникают расхождения в аналитике.
Использование getWeek вместо getISOWeek в
системах, где требуется строгий стандарт ISO, приводит к некорректным
отчётам.
Функция:
date-fnsgetWeek часто применяется вместе с:
startOfWeek — начало неделиendOfWeek — конец неделиformat — форматирование датaddWeeks — переход между неделямиimport { startOfWeek, endOfWeek, getWeek } from 'date-fns'
const start = startOfWeek(date, { weekStartsOn: 1 })
const end = endOfWeek(date, { weekStartsOn: 1 })
const weekNumber = getWeek(date, { weekStartsOn: 1 })
getWeek фактически реализует абстракцию:
Эта модель позволяет адаптировать календарь под любые региональные стандарты без изменения исходных данных.