Работа с датами почти всегда связана с вычислением границ временных интервалов: конца недели, месяца, квартала или года. Библиотека date-fns предоставляет набор функций, позволяющих безопасно и удобно находить последние дни различных периодов без ручных вычислений.
lastDayOfMonthФункция lastDayOfMonth возвращает объект
Date, представляющий последний день месяца для переданной
даты.
import { lastDayOfMonth } from 'date-fns'
const result = lastDayOfMonth(date)
import { lastDayOfMonth } from 'date-fns'
const date = new Date(2025, 0, 10)
const result = lastDayOfMonth(date)
console.log(result)
Результат:
2025-01-31T00:00:00.000Z
Если передана любая дата января 2025 года, функция автоматически определяет:
Это избавляет от необходимости вручную проверять:
if (month === 1 && leapYear) {
// февраль
}
Особенно полезна функция при работе с февралём.
import { lastDayOfMonth } from 'date-fns'
const result = lastDayOfMonth(new Date(2025, 1, 5))
console.log(result)
Результат:
2025-02-28T00:00:00.000Z
import { lastDayOfMonth } from 'date-fns'
const result = lastDayOfMonth(new Date(2024, 1, 5))
console.log(result)
Результат:
2024-02-29T00:00:00.000Z
lastDayOfWeekФункция lastDayOfWeek вычисляет конец недели.
import { lastDayOfWeek } from 'date-fns'
const date = new Date(2025, 4, 12)
const result = lastDayOfWeek(date)
console.log(result)
По умолчанию конец недели зависит от региональных настроек.
В JavaScript-проектах часто требуется явно задавать:
Для этого используется параметр weekStartsOn.
import { lastDayOfWeek } from 'date-fns'
const result = lastDayOfWeek(
new Date(2025, 4, 12),
{
weekStartsOn: 1
}
)
console.log(result)
Значения:
| Значение | День |
|---|---|
| 0 | воскресенье |
| 1 | понедельник |
| 2 | вторник |
| 3 | среда |
| 4 | четверг |
| 5 | пятница |
| 6 | суббота |
lastDayOfQuarterКварталы активно используются в:
import { lastDayOfQuarter } from 'date-fns'
const result = lastDayOfQuarter(
new Date(2025, 3, 18)
)
console.log(result)
Результат:
2025-06-30T00:00:00.000Z
| Квартал | Последний день |
|---|---|
| Q1 | 31 марта |
| Q2 | 30 июня |
| Q3 | 30 сентября |
| Q4 | 31 декабря |
lastDayOfYearФункция возвращает 31 декабря соответствующего года.
import { lastDayOfYear } from 'date-fns'
const result = lastDayOfYear(
new Date(2025, 6, 10)
)
console.log(result)
Результат:
2025-12-31T00:00:00.000Z
В библиотеке отсутствует встроенная функция для декад, однако Date-fns удобно комбинируется с обычной логикой JavaScript.
function getLastDayOfDecade(date) {
const day = date.getDate()
if (day <= 10) {
return 10
}
if (day <= 20) {
return 20
}
return new Date(
date.getFullYear(),
date.getMonth() + 1,
0
).getDate()
}
const result = getLastDayOfDecade(
new Date(2025, 0, 27)
)
console.log(result)
Результат:
31
lastDayOfISOWeekISO-стандарт определяет:
import { lastDayOfISOWeek } from 'date-fns'
const result = lastDayOfISOWeek(
new Date(2025, 4, 12)
)
console.log(result)
endOfMonth и lastDayOfMonthDate-fns содержит две похожие функции:
| Функция | Что возвращает |
|---|---|
lastDayOfMonth |
Последний день в 00:00 |
endOfMonth |
Последний момент месяца |
import {
lastDayOfMonth,
endOfMonth
} from 'date-fns'
const date = new Date(2025, 0, 15)
console.log(lastDayOfMonth(date))
console.log(endOfMonth(date))
Результат:
2025-01-31T00:00:00.000Z
2025-01-31T23:59:59.999Z
Определение последнего дня периода часто применяется при:
import {
startOfMonth,
endOfMonth
} from 'date-fns'
const start = startOfMonth(new Date())
const end = endOfMonth(new Date())
console.log(start)
console.log(end)
Функции определения конца периода обычно комбинируются с функциями начала периода.
import {
startOfQuarter,
endOfQuarter
} from 'date-fns'
const now = new Date()
const start = startOfQuarter(now)
const end = endOfQuarter(now)
console.log(start)
console.log(end)
После вычисления конца периода удобно использовать функцию
isWithinInterval.
import {
startOfMonth,
endOfMonth,
isWithinInterval
} from 'date-fns'
const target = new Date(2025, 0, 15)
const result = isWithinInterval(target, {
start: startOfMonth(target),
end: endOfMonth(target)
})
console.log(result)
Функции Date-fns работают с локальным часовым поясом среды выполнения.
Это означает, что результат зависит от:
const result = endOfMonth(new Date())
При сериализации через:
toISOString()
дата может визуально сместиться на предыдущий день из-за UTC.
date-fns-tzДля точной работы с часовыми поясами применяется date-fns-tz.
import { endOfDay } from 'date-fns'
import { toZonedTime } from 'date-fns-tz'
const date = new Date()
const zoned = toZonedTime(
date,
'Europe/Berlin'
)
console.log(endOfDay(zoned))
Функции Date-fns не изменяют исходный объект Date.
import { lastDayOfMonth } from 'date-fns'
const original = new Date(2025, 0, 15)
const result = lastDayOfMonth(original)
console.log(original)
console.log(result)
Исходная дата остаётся неизменной.
Это особенно важно:
Date-fns использует модульную архитектуру.
import { lastDayOfMonth } from 'date-fns'
Позволяет:
Все функции библиотеки имеют качественную типизацию.
import { lastDayOfMonth } from 'date-fns'
const result: Date = lastDayOfMonth(
new Date()
)
import {
startOfMonth,
endOfMonth,
format
} from 'date-fns'
function buildReportPeriod(date) {
const start = startOfMonth(date)
const end = endOfMonth(date)
return {
start,
end,
label: `${format(start, 'dd.MM.yyyy')} - ${format(end, 'dd.MM.yyyy')}`
}
}
console.log(
buildReportPeriod(new Date())
)
import {
lastDayOfMonth,
isAfter
} from 'date-fns'
const subscriptionEnd = lastDayOfMonth(
new Date(2025, 0, 1)
)
const expired = isAfter(
new Date(),
subscriptionEnd
)
console.log(expired)
| Функция | Назначение |
|---|---|
lastDayOfMonth |
Последний день месяца |
lastDayOfWeek |
Последний день недели |
lastDayOfISOWeek |
Последний день ISO-недели |
lastDayOfQuarter |
Последний день квартала |
lastDayOfYear |
Последний день года |
endOfDay |
Конец дня |
endOfWeek |
Конец недели |
endOfMonth |
Конец месяца |
endOfQuarter |
Конец квартала |
endOfYear |
Конец года |