Библиотека date-fns предоставляет большой набор функций для работы с
датами без изменения исходного объекта Date. Все операции
возвращают новую дату, что делает код предсказуемым и безопасным.
Для вычитания времени используются:
subsubDayssubMonthssubYearssubHourssubMinutessubSecondssubWeekssubQuarterssubBusinessDaysГлавная идея — уменьшение даты на определённое количество временных единиц.
Функция sub позволяет вычитать сразу несколько единиц
времени.
sub(date, duration)
| Параметр | Описание |
|---|---|
date |
Исходная дата |
duration |
Объект с единицами времени |
{
years,
months,
weeks,
days,
hours,
minutes,
seconds
}
import { sub } from 'date-fns'
const date = new Date(2026, 5, 15, 18, 30)
const result = sub(date, {
years: 1,
months: 2,
days: 10,
hours: 5
})
console.log(result)
Исходная дата:
15 июня 2026 18:30
После вычитания:
5 апреля 2025 13:30
sub применяет изменения последовательно:
Это важно при переходах между месяцами и високосными годами.
Функции библиотеки не изменяют оригинальный объект.
import { subDays } from 'date-fns'
const original = new Date(2026, 0, 10)
const changed = subDays(original, 5)
console.log(original)
console.log(changed)
original -> 10 января
changed -> 5 января
Исходная дата остаётся прежней.
subDays(date, amount)
import { subDays } from 'date-fns'
const date = new Date(2026, 7, 20)
const result = subDays(date, 7)
console.log(result)
13 августа 2026
Отрицательное число превращает вычитание в прибавление.
subDays(date, -5)
Аналогично:
addDays(date, 5)
import { subDays } from 'date-fns'
const date = new Date(2026, 2, 3)
const result = subDays(date, 10)
console.log(result)
21 февраля 2026
Функция корректно обрабатывает смену месяца.
subMonths(date, amount)
import { subMonths } from 'date-fns'
const date = new Date(2026, 8, 10)
const result = subMonths(date, 3)
console.log(result)
10 июня 2026
Одна из самых важных особенностей работы с датами — месяцы имеют разное количество дней.
import { subMonths } from 'date-fns'
const date = new Date(2026, 2, 31)
const result = subMonths(date, 1)
console.log(result)
28 февраля 2026
Дата автоматически приводится к последнему существующему дню месяца.
import { subMonths } from 'date-fns'
const date = new Date(2024, 2, 31)
const result = subMonths(date, 1)
console.log(result)
29 февраля 2024
subYears(date, amount)
import { subYears } from 'date-fns'
const date = new Date(2030, 5, 15)
const result = subYears(date, 10)
console.log(result)
15 июня 2020
import { subYears } from 'date-fns'
const date = new Date(2024, 1, 29)
const result = subYears(date, 1)
console.log(result)
28 февраля 2023
Так как 29 февраля в 2023 году не существует, дата автоматически корректируется.
subWeeks(date, amount)
import { subWeeks } from 'date-fns'
const date = new Date(2026, 10, 20)
const result = subWeeks(date, 2)
console.log(result)
6 ноября 2026
subWeeks(date, 1)
То же самое, что:
subDays(date, 7)
subHours(date, amount)
import { subHours } from 'date-fns'
const date = new Date(2026, 3, 10, 15, 0)
const result = subHours(date, 8)
console.log(result)
10 апреля 2026 07:00
import { subHours } from 'date-fns'
const date = new Date(2026, 3, 10, 3, 0)
const result = subHours(date, 5)
console.log(result)
9 апреля 2026 22:00
subMinutes(date, amount)
import { subMinutes } from 'date-fns'
const date = new Date(2026, 0, 1, 12, 30)
const result = subMinutes(date, 45)
console.log(result)
11:45
subSeconds(date, amount)
import { subSeconds } from 'date-fns'
const date = new Date(2026, 0, 1, 0, 0, 30)
const result = subSeconds(date, 45)
console.log(result)
31 декабря 2025 23:59:45
Квартал — это 3 месяца.
Функция удобна для:
subQuarters(date, amount)
import { subQuarters } from 'date-fns'
const date = new Date(2026, 9, 1)
const result = subQuarters(date, 2)
console.log(result)
1 апреля 2026
subBusinessDays исключает:
subBusinessDays(date, amount)
import { subBusinessDays } from 'date-fns'
const date = new Date(2026, 4, 18)
const result = subBusinessDays(date, 5)
console.log(result)
Если исходная дата — понедельник:
18 мая 2026
то 5 рабочих дней назад:
11 мая 2026
Выходные автоматически пропускаются.
Функция:
import {
subDays,
subHours,
subMinutes
} from 'date-fns'
const date = new Date()
const result = subMinutes(
subHours(
subDays(date, 2),
5
),
30
)
console.log(result)
Тот же пример проще записать через sub.
import { sub } from 'date-fns'
const result = sub(new Date(), {
days: 2,
hours: 5,
minutes: 30
})
Функции принимают обычный объект Date.
import { subDays } from 'date-fns'
const timestamp = Date.now()
const date = new Date(timestamp)
const result = subDays(date, 30)
console.log(result)
После вычитания дату часто форматируют.
import {
subDays,
format
} from 'date-fns'
const result = subDays(new Date(), 7)
console.log(
format(result, 'dd.MM.yyyy')
)
const weekAgo = subWeeks(new Date(), 1)
const prevMonth = subMonths(new Date(), 1)
const fifteenMinutesAgo =
subMinutes(new Date(), 15)
const expiresAt = subDays(deadline, 3)
31 марта - 1 месяц
Не существует:
31 февраля
28 февраля
date-fns работает поверх стандартного
Date.
Это означает:
subHours(date, 24)
Иногда это не эквивалентно:
subDays(date, 1)
при переходе летнего времени.
Функции библиотеки:
import { subDays } from 'date-fns'
import * as dateFns from 'date-fns'
const date = new Date()
date.setDate(date.getDate() - 5)
const result = subDays(new Date(), 5)
Большинство функций:
function subDays(date, amount) {
const copy = new Date(date)
copy.setDate(
copy.getDate() - amount
)
return copy
}
Реальная реализация сложнее и учитывает множество граничных случаев.
import {
subDays,
isAfter
} from 'date-fns'
const limitDate = subDays(new Date(), 30)
const filtered = posts.filter(post =>
isAfter(post.createdAt, limitDate)
)
import {
subHours,
isBefore
} from 'date-fns'
const expiredDate = subHours(
new Date(),
24
)
const expiredTokens =
tokens.filter(token =>
isBefore(token.createdAt, expiredDate)
)
import {
subQuarters,
startOfQuarter,
endOfQuarter
} from 'date-fns'
const previousQuarter =
subQuarters(new Date(), 1)
const start =
startOfQuarter(previousQuarter)
const end =
endOfQuarter(previousQuarter)
Подходит, когда:
sub(date, {
months: 1,
days: 5,
hours: 3
})
Подходит, когда:
subDays(date, 7)
| Функция | Назначение |
|---|---|
sub |
Универсальное вычитание |
subDays |
Вычитание дней |
subWeeks |
Вычитание недель |
subMonths |
Вычитание месяцев |
subYears |
Вычитание лет |
subHours |
Вычитание часов |
subMinutes |
Вычитание минут |
subSeconds |
Вычитание секунд |
subQuarters |
Вычитание кварталов |
subBusinessDays |
Вычитание рабочих дней |