Одной из наиболее частых проблем при использовании
date-fns становится ожидание полноценной поддержки
временных зон. Библиотека оперирует объектом Date из
JavaScript, который хранит момент времени в UTC, но отображает его в
локальной зоне окружения.
import { format } from 'date-fns';
const date = new Date('2026-01-01T00:00:00Z');
console.log(format(date, 'yyyy-MM-dd HH:mm'));
Результат зависит от локальной зоны выполнения кода, что часто приводит к расхождению между сервером и клиентом.
Для работы с временными зонами требуется использование дополнительных
инструментов, например date-fns-tz:
import { format } from 'date-fns-tz';
const date = new Date('2026-01-01T00:00:00Z');
console.log(format(date, 'yyyy-MM-dd HH:mm', {
timeZone: 'Europe/Moscow'
}));
Ключевой момент: date-fns сама по себе не управляет часовыми поясами, она лишь форматирует переданный момент времени.
Функция parse в date-fns требует строгого соответствия
шаблону. Любое несоответствие формату приводит к некорректным
результатам или Invalid Date.
import { parse } from 'date-fns';
const date = parse('2026/01/01', 'yyyy-MM-dd', new Date());
console.log(date);
Несоответствие разделителей (/ вместо -)
приводит к неверному разбору.
const date = parse('2026/01/01', 'yyyy/MM/dd', new Date());
Всегда фиксировать формат входной строки и не полагаться на автоматическое определение структуры даты.
JavaScript позволяет сравнивать даты напрямую, но это приводит к логическим ошибкам из-за сравнения объектов, а не значений времени.
const a = new Date('2026-01-01');
const b = new Date('2026-01-01');
console.log(a === b); // false
import { isEqual } from 'date-fns';
console.log(isEqual(a, b)); // true
a.getTime() === b.getTime();
Некоторые функции date-fns возвращают новый объект даты, но разработчики часто предполагают мутацию исходного значения.
import { addDays } from 'date-fns';
const date = new Date('2026-01-01');
addDays(date, 5);
console.log(date); // исходная дата не изменилась
const newDate = addDays(date, 5);
Важно: все функции date-fns являются чистыми и не изменяют входные данные.
date-fns ожидает объекты Date, а не числа,
представляющие UNIX timestamp.
import { format } from 'date-fns';
const ts = 1767225600000;
console.log(format(ts, 'yyyy-MM-dd'));
Результат может быть некорректным или зависеть от неявного преобразования.
const date = new Date(ts);
console.log(format(date, 'yyyy-MM-dd'));
Форматирование с локалями требует явного подключения нужного языка.
import { format } from 'date-fns';
format(new Date(), 'PPPP');
Результат всегда будет на английском языке.
import { format } from 'date-fns';
import { ru } from 'date-fns/locale';
format(new Date(), 'PPPP', { locale: ru });
Подключение локали без передачи её в функцию не даёт эффекта.
Функции startOfDay, endOfDay,
startOfMonth часто используются для фильтрации данных, но
приводят к логическим ошибкам при смешении зон и форматов.
import { endOfDay } from 'date-fns';
const end = endOfDay(new Date('2026-01-01'));
Ожидается конец дня в UTC, но возвращается локальное время.
Для серверной логики необходимо явно нормализовать данные:
const end = endOfDay(new Date(Date.UTC(2026, 0, 1)));
Функции вроде isWithinInterval чувствительны к порядку
границ.
import { isWithinInterval } from 'date-fns';
isWithinInterval(new Date('2026-01-10'), {
start: new Date('2026-01-20'),
end: new Date('2026-01-01')
});
Результат всегда false, даже если логика предполагает
обратное.
Перед использованием интервал должен быть нормализован:
const start = new Date('2026-01-01');
const end = new Date('2026-01-20');
isWithinInterval(date, { start, end });
При многократных преобразованиях дат часто теряется точность из-за приведения типов и округлений.
const date = new Date(Math.round(Date.now() / 1000) * 1000);
Использовать единый формат хранения времени — миллисекунды:
const timestamp = Date.now();
const date = new Date(timestamp);
date-fns часто используется в функциональных цепочках, где легко потерять промежуточный результат.
import { addDays, format } from 'date-fns';
format(addDays(new Date(), 3), 'yyyy-MM-dd');
При усложнении логики это приводит к ухудшению читаемости и ошибкам при изменении порядка операций.
const base = new Date();
const shifted = addDays(base, 3);
const result = format(shifted, 'yyyy-MM-dd');
При интеграции с другими библиотеками даты часто приходят в разных форматах: ISO, timestamp, строки.
parseISO('01-01-2026'); // неверный формат
Разделение входных типов:
import { parseISO, fromUnixTime } from 'date-fns';
const a = parseISO('2026-01-01');
const b = fromUnixTime(1767225600);
Объекты Date изменяемы по внутреннему состоянию при
операциях форматирования и преобразования в сторонних слоях
приложения.
Повторное использование одного объекта даты в разных частях системы приводит к рассинхронизации логики отображения и расчётов.
Всегда создавать копии:
const copy = new Date(original.getTime());