Библиотека date-fns построена вокруг строго функционального подхода. Каждая операция над датой представлена отдельной функцией, которая принимает входные параметры и возвращает новый результат без побочных эффектов.
Ключевая особенность:
Такой подход делает API предсказуемым и хорошо совместимым с современными инструментами сборки.
Одно из принципиальных отличий API date-fns — модульная структура. Каждая функция существует как отдельный модуль:
import format from 'date-fns/format'
import addDays from 'date-fns/addDays'
Такой стиль импорта приводит к важным особенностям:
В отличие от монолитных библиотек, где API доступен через единый объект, date-fns требует явного указания используемых функций.
Функции date-fns используют строго определённый порядок аргументов:
Пример:
format(new Date(), 'yyyy-MM-dd')
или
addDays(new Date(), 5)
Особенности такого подхода:
Дополнительные настройки почти всегда передаются последним аргументом:
format(new Date(), 'PPP', { locale: ru })
Все функции date-fns возвращают новый объект Date или новое значение, не изменяя исходные данные.
Пример поведения:
const date = new Date()
const newDate = addDays(date, 3)
После выполнения:
date остаётся неизменнойnewDate содержит результат вычисленияЭто отличается от библиотек, где методы могут мутировать исходный объект. В API date-fns это исключено на уровне дизайна.
Date-fns не модифицирует глобальный объект Date и не
добавляет методы в его прототип.
Это означает:
Date.prototype.formatDate.prototype.addDaysТакое решение устраняет конфликты с другими библиотеками и снижает риск неожиданных изменений поведения стандартного объекта.
В date-fns существует два подхода к использованию функций:
Стандартные функции с привычным порядком аргументов:
import add from 'date-fns/add'
add(new Date(), { days: 2 })
Функции в стиле функционального программирования с каррированием и изменённым порядком аргументов:
import { add } from 'date-fns/fp'
const addTwoDays = add({ days: 2 })
addTwoDays(new Date())
Отличия FP-API:
Некоторые функции имеют разные сигнатуры в зависимости от версии API.
Основной API:
format(date, formatString, options)
FP API:
format(formatString, options)(date)
Это создаёт два разных стиля работы:
Поддержка локалей реализована через явную передачу объекта локали:
import { ru } from 'date-fns/locale'
format(new Date(), 'PPP', { locale: ru })
Отличия API в работе с локалями:
Такой подход исключает глобальное состояние и делает локализацию изолированной.
Эволюция date-fns сопровождалась изменениями в API.
Основные изменения:
API date-fns придерживается строгой модели:
Invalid DateПример поведения:
format(new Date('invalid'), 'yyyy-MM-dd')
// Invalid Date
Такой подход отличается от библиотек, где ошибки могут обрабатываться внутри и заменяться fallback-значениями.
Несмотря на большое количество функций, API сохраняет структурную консистентность:
Примеры:
addMonths(date, 1)
subDays(date, 10)
differenceInDays(dateLeft, dateRight)
Различия между функциями минимальны и касаются только семантики операции.
В отличие от OOP-библиотек:
date.add().format()Каждая операция — это самостоятельная функция:
format(addDays(new Date(), 3), 'yyyy-MM-dd')
Такой стиль делает API более прозрачным, но требует явного управления вложенностью вызовов.
API date-fns ориентирован на стабильность:
Это снижает вероятность поломки кода при обновлениях и делает API предсказуемым в долгосрочной перспективе.