Что такое date-fns и зачем она нужна

Библиотека date-fns представляет собой современный инструмент для работы с датами в JavaScript. Она обеспечивает функциональный подход к обработке дат, предоставляя более 200 функций для парсинга, форматирования, сравнения, манипуляций и вычислений с объектами Date. В отличие от встроенного объекта Date и других библиотек вроде Moment.js, date-fns ориентирована на модульность, позволяя импортировать только необходимые функции, что снижает размер итогового бандла и повышает производительность приложений.

Ключевые возможности библиотеки включают:

  • Форматирование дат с использованием удобных и гибких шаблонов.
  • Парсинг строк в объекты Date.
  • Сравнение дат и вычисление интервалов между ними.
  • Манипуляции с датами, включая добавление или вычитание дней, месяцев, лет, часов и минут.
  • Локализация с поддержкой множества языков.
  • Утилиты для работы с интервалами и диапазонами дат.

Работа с объектами Date

Объект Date в JavaScript имеет ряд ограничений, включая сложность вычислений разницы между датами, работу с часовыми поясами и форматирование. date-fns решает эти проблемы, предоставляя чистые функции, которые не мутируют исходный объект Date, а возвращают новый объект с требуемыми изменениями.

Например, для добавления 5 дней к текущей дате используется функция:

import { addDays } from 'date-fns';

const today = new Date();
const futureDate = addDays(today, 5);

Функция addDays возвращает новый объект Date, не изменяя today. Такой подход предотвращает непреднамеренные побочные эффекты и повышает читаемость кода.


Форматирование дат

Форматирование — одна из ключевых задач при работе с датами. date-fns предоставляет функцию format, которая позволяет преобразовать дату в строку с использованием шаблонов.

Примеры форматов:

import { format } from 'date-fns';

const date = new Date(2026, 4, 22); // 22 мая 2026
format(date, 'dd/MM/yyyy');         // "22/05/2026"
format(date, 'EEEE, MMMM do, yyyy'); // "Friday, May 22nd, 2026"

Особенности:

  • Символы шаблона (dd, MM, yyyy, EEEE) строго соответствуют стандарту библиотеки.
  • Поддерживается локализация через подключение соответствующих языковых пакетов, например import { ru } from 'date-fns/locale'.

Парсинг строк в даты

Парсинг строк в объект Date с использованием встроенного конструктора new Date() часто приводит к неожиданным результатам, особенно при работе с нестандартными форматами. date-fns предоставляет функцию parse для безопасного преобразования строк в Date:

import { parse } from 'date-fns';

const dateString = '22-05-2026';
const parsedDate = parse(dateString, 'dd-MM-yyyy', new Date());
  • Третий аргумент (new Date()) служит отправной точкой для вычисления даты.
  • Формат должен точно соответствовать строке, иначе результат может быть Invalid Date.

Сравнение и вычисление разниц

Для сравнения дат используются функции isBefore, isAfter, isEqual. Для вычисления интервалов доступны differenceInDays, differenceInMonths и подобные:

import { differenceInDays, isBefore } from 'date-fns';

const startDate = new Date(2026, 4, 22);
const endDate = new Date(2026, 5, 1);

const daysBetween = differenceInDays(endDate, startDate); // 10
const check = isBefore(startDate, endDate); // true

Преимущества:

  • Легко вычислять разницу между датами в различных единицах.
  • Минимизируется риск ошибок при ручном подсчёте дней, месяцев и лет.

Манипуляции с датами

Библиотека позволяет добавлять и вычитать разные единицы времени с высокой точностью. Функции addDays, subDays, addMonths, subYears возвращают новые объекты Date:

import { subMonths, addYears } from 'date-fns';

const now = new Date();
const lastMonth = subMonths(now, 1);
const nextYear = addYears(now, 1);

Особое внимание уделяется корректной работе с переходами через месяц, год и високосные даты.


Работа с интервалами и диапазонами

Функции вроде eachDayOfInterval, isWithinInterval, intervalToDuration упрощают работу с диапазонами дат:

import { eachDayOfInterval, isWithinInterval } from 'date-fns';

const interval = { start: new Date(2026, 4, 1), end: new Date(2026, 4, 7) };
const days = eachDayOfInterval(interval); // массив всех дней с 1 по 7 мая

const checkDate = new Date(2026, 4, 4);
const result = isWithinInterval(checkDate, interval); // true

Преимущества интервалов:

  • Генерация массивов дат для календарей и планировщиков.
  • Проверка принадлежности даты заданному диапазону.
  • Вычисление длительности периода в днях, месяцах, часах.

Локализация

date-fns поддерживает множество языков, что позволяет форматировать даты в соответствии с локальными стандартами. Пример использования русской локализации:

import { format } from 'date-fns';
import { ru } from 'date-fns/locale';

const date = new Date(2026, 4, 22);
format(date, "eeee, d MMMM yyyy", { locale: ru }); // "пятница, 22 мая 2026"
  • Подключение конкретной локали осуществляется через объект, импортируемый из date-fns/locale.
  • Локализация влияет на форматирование дней недели, месяцев и порядковых числительных.

Преимущества использования date-fns

  1. Модульность — можно импортировать только нужные функции.
  2. Функциональный подход — функции не изменяют исходные объекты Date.
  3. Поддержка современных стандартов — работа с ECMAScript и TypeScript.
  4. Высокая производительность — нет лишнего кода, как в монолитных библиотеках.
  5. Широкий набор функций — покрывает практически все задачи работы с датами.

date-fns обеспечивает системный, предсказуемый и безопасный способ работы с датами в JavaScript, что делает её незаменимым инструментом для современных веб-приложений.