ISO-неделя — это система нумерации недель года, стандартизированная ISO 8601. В отличие от «обычного» календарного подхода, где неделя начинается с 1 января и может иметь произвольное смещение, ISO-недели подчиняются строгим правилам:
Это приводит к важному следствию: начало календарного года может относиться к последней ISO-неделе предыдущего года, а конец декабря — к первой ISO-неделе следующего года.
Например:
Такая модель используется в финансовых системах, аналитике, логистике и любых областях, где важна строгая недельная структура без «рваных» границ месяцев.
getISOWeekВ библиотеке date-fns функция
getISOWeek предназначена для вычисления номера ISO-недели
для заданной даты.
Она возвращает число от 1 до 52 (иногда до 53), соответствующее ISO-неделе года, к которой относится дата.
getISOWeek(date)
date — объект Date или временная
меткаnumber (номер ISO-недели)Функция опирается на стандартизированное правило ISO:
Ключевой момент: расчёт не зависит от локальных настроек календаря (например, первого дня недели в стране).
import { getISOWeek } from 'date-fns';
const date = new Date(2024, 0, 10); // 10 января 2024
const week = getISOWeek(date);
console.log(week);
Если дата попадает во вторую или третью неделю января, результат будет соответствующим ISO-структуре, а не календарному смещению.
import { getISOWeek } from 'date-fns';
const date = new Date(2020, 11, 31); // 31 декабря 2020
const week = getISOWeek(date);
console.log(week);
Несмотря на то, что дата находится в конце календарного года, она может относиться к первой ISO-неделе следующего года.
import { getISOWeek } from 'date-fns';
console.log(getISOWeek(new Date(2021, 11, 27))); // декабрь 2021
console.log(getISOWeek(new Date(2022, 0, 3))); // январь 2022
Обе даты могут попасть в одну и ту же ISO-неделю, если они находятся в переходном периоде.
getWeekВ date-fns существует также функция
getWeek, которая выглядит похожей, но имеет принципиальные
отличия:
| Функция | Основа расчёта | Гибкость | Стандарт |
|---|---|---|---|
getWeek |
локальные настройки | высокая | нет |
getISOWeek |
ISO 8601 | фиксированная | да |
getISOWeek всегда считает недели по ISO-правиламgetWeek зависит от параметров
options.weekStartsOn и
options.firstWeekContainsDategetISOWeek гарантирует совместимость между системами и
странамиАлгоритм ISO-нумерации включает несколько шагов:
Дата приводится к UTC-подобному виду для исключения влияния часового пояса.
ISO-неделя всегда «якорится» на четверге. Это связано с правилом определения первой недели года.
ISO-год может начинаться в конце декабря предыдущего календарного года, если первая неделя нового года начинается позже.
Количество недель между началом ISO-года и текущей датой формирует результат.
Некоторые годы содержат 53 недели вместо 52. Это происходит, если:
В таких случаях декабрь «растягивается» на дополнительную неделю.
Пример ситуации:
Таким образом, ISO-неделя не привязана строго к границам календарного года.
ISO-недели позволяют агрегировать данные по фиксированным временным блокам:
Многие бухгалтерские и банковские системы используют ISO-недели для:
В системах управления задачами ISO-неделя позволяет избежать путаницы между месяцами и календарными переходами.
ISO-неделя почти никогда не совпадает с неделей, начинающейся в воскресенье или другом локальном формате.
Даты в начале января и конце декабря часто относятся к «чужому» ISO-году, что приводит к некорректной группировке данных.
getWeek и getISOWeekИспользование обеих функций в одной системе без чёткой логики приводит к несогласованным результатам в отчётах.
getISOWeek часто используется вместе с:
startOfISOWeek — начало ISO-неделиendOfISOWeek — конец ISO-неделиgetISOWeekYear — ISO-год датыsetISOWeek — установка номера неделиКомбинация этих функций позволяет строить полноценные календарные системы.
Функция учитывает локальное время, но логика ISO-недель остаётся неизменной.
Особенности:
getISOWeek(new Date(1970, 0, 1))
Результат зависит от того, в какую ISO-неделю попадает начало эпохи Unix.
Алгоритм сохраняет корректность для исторических и будущих дат, так как основан на математическом расчёте недель относительно ISO-якоря, а не на календарных таблицах.
getISOWeek относится к лёгким операциям:
Это делает функцию пригодной для массовых вычислений, например при обработке массивов дат.
import { getISOWeek } from 'date-fns';
const dates = [
new Date(2024, 0, 1),
new Date(2024, 0, 8),
new Date(2024, 0, 15),
];
const weeks = dates.map(getISOWeek);
Такой подход используется при построении недельных агрегатов и группировок данных.
ISO-неделя часто становится базовой единицей измерения времени:
Использование стандартизированного номера недели устраняет неоднозначности между регионами и календарными системами.