Функция getDaysInMonth предназначена для получения
количества дней в месяце, соответствующем переданной дате. Она опирается
на календарную логику JavaScript Date и учитывает
особенности разных месяцев, включая високосные годы.
Основная идея заключается в том, что достаточно передать любую дату внутри нужного месяца, а результатом станет точное количество дней в этом месяце.
import { getDaysInMonth } from 'date-fns';
getDaysInMonth(new Date(2024, 1, 10)); // 29
getDaysInMonth(new Date(2023, 1, 10)); // 28
getDaysInMonth(new Date(2023, 0, 1)); // 31
getDaysInMonth(date: Date | number): number
Параметр может быть:
DateВозвращаемое значение — число дней в месяце (от 28 до 31).
Внутри логика основана на определении следующего месяца и вычислении разницы дат. Концептуально это выглядит так:
Это позволяет корректно учитывать:
Эти месяцы всегда имеют 31 день.
getDaysInMonth(new Date(2025, 0)); // 31 (январь)
getDaysInMonth(new Date(2025, 6)); // 31 (июль)
Эти месяцы всегда имеют 30 дней.
getDaysInMonth(new Date(2025, 3)); // 30 (апрель)
getDaysInMonth(new Date(2025, 8)); // 30 (сентябрь)
Февраль зависит от високосного года:
getDaysInMonth(new Date(2023, 1)); // 28
getDaysInMonth(new Date(2024, 1)); // 29
Високосность определяется стандартными правилами григорианского календаря:
Примеры:
Функция getDaysInMonth не требует ручной проверки этих
правил, так как использует встроенную календарную модель JavaScript.
getDaysInMonth(new Date(2025, 4, 15)); // май → 31
getDaysInMonth(Date.now());
Это позволяет работать с данными из API, где даты часто представлены числами.
Строки напрямую не являются безопасным входом. Обычно требуется предварительное преобразование:
import { parseISO, getDaysInMonth } from 'date-fns';
getDaysInMonth(parseISO('2025-06-10'));
Часто используется для проверки корректности дней месяца:
function isValidDay(year, month, day) {
const maxDays = getDaysInMonth(new Date(year, month));
return day >= 1 && day <= maxDays;
}
При генерации календарной сетки необходимо знать длину месяца:
function generateMonth(year, month) {
const days = getDaysInMonth(new Date(year, month));
return Array.from({ length: days }, (_, i) => i + 1);
}
Используется при формировании периодов:
function getMonthRange(year, month) {
const start = new Date(year, month, 1);
const end = new Date(year, month, getDaysInMonth(start));
return { start, end };
}
Важно учитывать, что в JavaScript и date-fns месяцы нумеруются с нуля:
Это влияет на передаваемые параметры:
new Date(2025, 0); // январь
new Date(2025, 11); // декабрь
Ошибка в индексации может привести к неверным результатам в логике расчёта.
Хотя getDaysInMonth работает с датой как с абстракцией
календаря, в JavaScript возможны нюансы:
Date хранит время в UTC внутриСледовательно, результат функции стабилен независимо от часового пояса.
getDaysInMonth(new Date('invalid'));
В подобных случаях результат может быть некорректным (часто
NaN), так как внутренняя дата становится
недействительной.
getDaysInMonth(new Date(2025, 11)); // декабрь → 31
Логика корректно обрабатывает декабрь без необходимости дополнительных условий.
Функция выполняет минимальный набор операций:
DateОперации имеют константную сложность O(1), поэтому функция подходит для массовых вычислений:
Без использования библиотеки обычно пишут:
function getDaysInMonthNative(date) {
const year = date.getFullYear();
const month = date.getMonth();
return new Date(year, month + 1, 0).getDate();
}
Вариант из date-fns:
import { getDaysInMonth } from 'date-fns';
Разница заключается в:
function dailyRate(monthlySalary, date) {
const days = getDaysInMonth(date);
return monthlySalary / days;
}
function getMonthlySchedule(year, month) {
const days = getDaysInMonth(new Date(year, month));
return new Array(days).fill(null).map((_, i) => ({
day: i + 1,
tasks: []
}));
}
Функция не мутирует исходную дату и не изменяет входные данные. Она
работает исключительно на основе чтения значений Date.
const d = new Date(2025, 2, 15);
getDaysInMonth(d);
d.getDate(); // остаётся неизменным
// ошибка: строка без парсинга
getDaysInMonth('2025-05-10');
// корректно
getDaysInMonth(parseISO('2025-05-10'));
Функция строго следует григорианскому календарю и не учитывает:
Это делает её предсказуемой в современных приложениях, где используется стандартная календарная система.