Библиотека date-fns предоставляет набор чистых функций для работы с
датами в JavaScript без мутаций исходных объектов Date.
Одной из ключевых групп функций являются операции установки компонентов
даты, позволяющие изменять год, месяц, день и другие части времени в
иммутабельном стиле.
Все функции установки в date-fns возвращают новый объект
Date, не изменяя исходный. Это важное отличие от
нативных методов JavaScript, таких как setFullYear,
setMonth и других, которые мутируют объект.
Основные последствия такого подхода:
Функция set позволяет одновременно изменить несколько
частей даты за один вызов.
set(date, values)
date — исходный объект Datevalues — объект с полями для измененияПоддерживаемые поля:
yearmonth (0–11)date (день месяца)hoursminutessecondsmillisecondsimport { set } from "date-fns";
const baseDate = new Date(2024, 5, 10, 12, 30);
const upd ated = se t(baseDate, {
year: 2025,
month: 0,
date: 1
});
console.log(upd ated);
// 1 января 2025, 12:30
Исходная дата остаётся неизменной:
console.log(baseDate);
// 10 июня 2024, 12:30
const date = new Date(2024, 5, 10, 12, 30, 45);
const result = se t(date, {
hours: 0,
minutes: 0,
seconds: 0
});
console.log(result);
// 10 июня 2024, 00:00:00
set(new Date(2024, 0, 31), { month: 1, date: 40 });
// корректно пересчитает дату с переносом в следующий месяц
Локальное время Все операции выполняются в локальном часовом поясе среды выполнения.
Порядок применения Значения применяются одновременно, что исключает промежуточные состояния.
Функция setYear предназначена для точечного изменения
года без необходимости указывать другие компоненты даты.
setYear(date, year)
import { setYear } from "date-fns";
const date = new Date(2020, 5, 15);
const upd ated = setYear(date, 2026);
console.log(upd ated);
// 15 июня 2026
Особенность работы с 29 февраля:
const leapDate = new Date(2020, 1, 29);
const result = setYear(leapDate, 2021);
console.log(result);
// 1 марта 2021 (или 28 февраля в зависимости от нормализации среды)
Это связано с тем, что 29 февраля не существует в невисокосный год, и JavaScript автоматически корректирует дату.
set(date, { year: 2025 })
setYear(date, 2025)
Функционально результаты схожи, но:
setYear — более узкая и читаемая операцияset — универсальный инструмент для нескольких полей
одновременноФункция setMonth изменяет месяц даты, сохраняя остальные
компоненты.
setMonth(date, month)
month — число от 0 до 11import { setMonth } from "date-fns";
const date = new Date(2024, 0, 15);
const upd ated = setMonth(date, 5);
console.log(upd ated);
// 15 июня 2024
В JavaScript и date-fns:
0 — январь1 — февраль11 — декабрьЭто часто является источником ошибок при работе с датами.
Если текущий день не существует в новом месяце, происходит автоматическая корректировка:
const date = new Date(2024, 0, 31);
const upd ated = setMonth(date, 1);
console.log(upd ated);
// 2 марта 2024 (или 29 февраля в високосный год)
Причина — февраль не имеет 31 дня, поэтому дата «перепрыгивает» в следующий месяц.
import { setMonth, setYear } from "date-fns";
const date = new Date(2024, 0, 10);
const result = setYear(setMonth(date, 11), 2025);
console.log(result);
// 10 декабря 2025
Такой подход часто применяется в функциональных цепочках.
set — комплексное изменение нескольких компонентовsetYear — изменение только годаsetMonth — изменение только месяцаset(date, { year: 2025, month: 6 })
vs
setMonth(setYear(date, 2025), 6)
Первый вариант:
Второй вариант:
Разница минимальна, но:
set выполняет одну операциюsetYear + setMonth создают
несколько промежуточных объектов DateВсе функции используют внутреннюю нормализацию Jav * aScript:
setMonth(new Date(2024, 0, 15), -1);
// декабрь предыдущего года
set(new Date(2024, 0, 31), { month: 1, date: 31 });
Результат будет автоматически скорректирован, поскольку февраль не имеет 31 дня.
setYear(new Date(2020, 1, 29), 2024);
Дата остаётся корректной, так как 2024 — високосный год.
const base = new Date();
const eventDate = se t(base, {
year: 2027,
month: 8,
date: 1
});
const reset = setYear(new Date(), 2030);
const january = setMonth(reset, 0);
const periodStart = se t(new Date(), {
date: 1,
hours: 0,
minutes: 0,
seconds: 0,
milliseconds: 0
});
При переключении месяцев в UI часто используется
setMonth:
function nextMonth(date) {
return setMonth(date, date.getMonth() + 1);
}
Функции установки часто комбинируются с:
add / sub — арифметика датstartOfMonth, startOfYear — нормализация
границformat — вывод результатаПример:
import { setMonth, startOfMonth, format } from "date-fns";
const date = new Date(2024, 0, 15);
const next = startOfMonth(setMonth(date, 5));
console.log(format(next, "yyyy-MM-dd"));
// 2024-06-01
Функции set, setYear, setMonth
реализованы в едином стиле:
DateЭто делает библиотеку удобной для:
setMonth(date, 6); // июль, а не июнь
setMonth(date, 5);
console.log(date); // старая дата, без изменений
setYear(setMonth(date, 1), 2025);
Важно учитывать, что каждый вызов создаёт новый объект.
const result = setMonth(
setYear(
set(new Date(), { date: 10 }),
2035
),
9
);
Каждый уровень возвращает новый Date, формируя чистую
цепочку преобразований без побочных эффектов.