Библиотека Date-fns строится на принципах функционального программирования, что обеспечивает чистоту, предсказуемость и удобство работы с датами. В основе лежат функции, которые не изменяют исходные данные, а возвращают новые значения, что предотвращает неожиданные побочные эффекты и упрощает тестирование кода.
Все методы Date-fns являются чистыми функциями. Это значит:
Пример работы с чистой функцией:
import { addDays } from 'date-fns';
const today = new Date(2026, 4, 22); // 22 мая 2026
const nextWeek = addDays(today, 7);
console.log(today); // 22 мая 2026
console.log(nextWeek); // 29 мая 2026
Здесь addDays не изменяет объект today, а
возвращает новый объект даты.
Date-fns построена как набор мелких, специализированных функций, что позволяет:
Пример композиции функций:
import { addDays, format, startOfMonth } from 'date-fns';
const today = new Date(2026, 4, 22);
const firstDayNextMonth = startOfMonth(addDays(today, 30));
const formatted = format(firstDayNextMonth, 'yyyy-MM-dd');
console.log(formatted); // '2026-06-21' (пример)
Здесь функции комбинируются так, что каждая выполняет одну задачу, а результат передается следующей функции.
Функциональный подход способствует декларативному коду, который легче понимать и сопровождать:
import { differenceInDays, isBefore } from 'date-fns';
const start = new Date(2026, 4, 1);
const end = new Date(2026, 4, 22);
if (isBefore(start, end)) {
console.log(differenceInDays(end, start)); // 21
}
Каждая функция явно выражает свое назначение:
isBefore проверяет порядок дат,
differenceInDays вычисляет разницу. Такой код легче
воспринимается и проверяется на ошибки.
Функциональные функции легко интегрируются с массивами и коллекциями, используя стандартные методы Jav * aScript:
import { format } from 'date-fns';
const dates = [
new Date(2026, 4, 20),
new Date(2026, 4, 21),
new Date(2026, 4, 22),
];
const formattedDates = dates.map(date => format(date, 'dd.MM.yyyy'));
console.log(formattedDates); // ['20.05.2026', '21.05.2026', '22.05.2026']
Функции легко встраиваются в цепочки обработки данных, обеспечивая чистый и предсказуемый результат.
Функциональный подход позволяет отделять логику вычислений от представления. Форматирование дат можно задавать отдельно, передавая локализацию:
import { format } from 'date-fns';
import { ru } from 'date-fns/locale';
const date = new Date(2026, 4, 22);
const formatted = format(date, "d MMMM yyyy", { locale: ru });
console.log(formatted); // '22 мая 2026'
Это повышает гибкость кода и облегчает поддержку мультиязычных приложений.
Функциональный подход минимизирует вероятность ошибок, так как:
Пример тестирования функции:
import { addDays } from 'date-fns';
test('addDays добавляет дни корректно', () => {
const date = new Date(2026, 4, 22);
expect(addDays(date, 5)).toEqual(new Date(2026, 4, 27));
expect(date).toEqual(new Date(2026, 4, 22)); // исходная дата не изменилась
});
Такой подход гарантирует стабильность работы функций и упрощает сопровождение больших проектов.
Функциональный стиль Date-fns сочетает чистоту, предсказуемость, модульность и удобство тестирования, делая работу с датами в JavaScript более надежной и масштабируемой.