Библиотека date-fns предоставляет набор функций для безопасной и удобной работы с датами. Одной из наиболее востребованных задач является добавление временных интервалов: дней, месяцев, лет, часов и других единиц времени.
Для этого используются как универсальная функция add,
так и специализированные функции:
addDaysaddMonthsaddYearsaddHoursaddMinutesaddSecondsЧерез npm:
npm install date-fns
Импорт отдельных функций:
import { add, addDays, addMonths, addYears } from 'date-fns'
Главная особенность библиотеки — модульность. Импортируются только используемые функции, благодаря чему уменьшается размер итогового бандла.
add(date, duration)
| Параметр | Описание |
|---|---|
date |
Исходная дата |
duration |
Объект с единицами времени |
Объект duration может содержать:
{
years,
months,
weeks,
days,
hours,
minutes,
seconds
}
import { add } from 'date-fns'
const date = new Date(2025, 0, 10)
const result = add(date, {
years: 1,
months: 2,
days: 5
})
console.log(result)
Результат:
2026-03-15T00:00:00.000Z
Функции в date-fns являются immutable — они не мутируют оригинальный
объект Date.
const original = new Date(2025, 0, 1)
const updated = addDays(original, 10)
console.log(original)
console.log(updated)
Это особенно важно при работе с состоянием в React, Redux и других системах управления данными.
addDays(date, amount)
import { addDays } from 'date-fns'
const date = new Date(2025, 4, 1)
const result = addDays(date, 7)
console.log(result)
Отрицательное число вычитает дни.
const result = addDays(new Date(2025, 4, 10), -3)
Результат:
2025-05-07
const result = addDays(
new Date(2025, 0, 30),
5
)
Результат автоматически перейдёт в следующий месяц:
2025-02-04
addMonths(date, amount)
import { addMonths } from 'date-fns'
const date = new Date(2025, 0, 15)
const result = addMonths(date, 3)
console.log(result)
Добавление месяцев — одна из самых сложных операций при работе с датами.
Например:
const result = addMonths(
new Date(2025, 0, 31),
1
)
console.log(result)
Февраль не содержит 31 числа, поэтому результат будет скорректирован:
2025-02-28
В високосный год:
2024-02-29
Алгоритм:
Это защищает от появления невалидных дат.
const result = addMonths(
new Date(2025, 5, 10),
18
)
Результат:
2026-12-10
Функция автоматически корректно переносит год.
addYears(date, amount)
import { addYears } from 'date-fns'
const date = new Date(2025, 0, 1)
const result = addYears(date, 5)
console.log(result)
Особое внимание необходимо уделять 29 февраля.
const result = addYears(
new Date(2024, 1, 29),
1
)
console.log(result)
2025 год не является високосным, поэтому дата будет скорректирована:
2025-02-28
add(date, {
days: 10
})
addDays(date, 10)
add подходит в ситуациях:
Пример:
const duration = {
days: 3,
months: 2,
years: 1
}
const result = add(date, duration)
addDays, addMonths, addYears
удобнее:
Пример:
const expirationDate = addDays(now, 30)
Такой код читается проще, чем:
const expirationDate = add(now, {
days: 30
})
import { addHours } from 'date-fns'
const result = addHours(new Date(), 5)
import { addMinutes } from 'date-fns'
const result = addMinutes(new Date(), 30)
import { addSeconds } from 'date-fns'
const result = addSeconds(new Date(), 45)
Функции можно комбинировать.
const result = addDays(
addMonths(new Date(), 2),
10
)
Однако более читаемым вариантом часто становится использование
add:
const result = add(new Date(), {
months: 2,
days: 10
})
const expiresAt = addHours(new Date(), 2)
const subscriptionEnd = addMonths(new Date(), 1)
const deadline = addDays(new Date(), 14)
const nextConference = addYears(new Date(), 1)
Функции принимают не только объект Date, но и
timestamp.
const result = addDays(Date.now(), 5)
Строку рекомендуется предварительно преобразовывать в дату.
import { parseISO, addDays } from 'date-fns'
const date = parseISO('2025-05-10')
const result = addDays(date, 7)
Если передать невалидную дату:
addDays(new Date('invalid'), 5)
Результат:
Invalid Date
Для проверки используется isValid.
import { isValid } from 'date-fns'
const date = new Date('invalid')
console.log(isValid(date))
Функции работают с локальным часовым поясом JavaScript runtime.
const result = addDays(new Date(), 1)
Результат зависит от timezone среды выполнения:
Для сложной timezone-логики обычно используется дополнительно
библиотека date-fns-tz.
Функции date-fns:
const date = new Date()
date.setDate(date.getDate() + 5)
Недостатки:
const result = addDays(new Date(), 5)
Преимущества:
Функции полностью поддерживают TypeScript.
import { addDays } from 'date-fns'
const result: Date = addDays(new Date(), 10)
addMonths(new Date(2025, 0, 31), 1)
Результат:
2025-02-28
Но:
addMonths(new Date(2025, 2, 31), 1)
Результат:
2025-04-30
Это поведение необходимо учитывать при:
function extendLicense(date) {
return addYears(date, 1)
}
function getTrialEnd() {
return addDays(new Date(), 14)
}
function getNextPaymentDate(date) {
return addMonths(date, 1)
}
Для простых операций:
addDays(date, 5)
вместо:
add(date, {
days: 5
})
add(date, {
years: 1,
months: 3,
days: 10,
hours: 5
})
Нежелательно:
date.setTime(
date.getTime() + 86400000
)
Причины:
| Функция | Назначение |
|---|---|
add |
Универсальное добавление |
addDays |
Добавление дней |
addMonths |
Добавление месяцев |
addYears |
Добавление лет |
addHours |
Добавление часов |
addMinutes |
Добавление минут |
addSeconds |
Добавление секунд |
addWeeks |
Добавление недель |