isBefore и isAfter

Базовое назначение функций сравнения дат

Функции isBefore и isAfter используются для определения хронологического порядка двух значений даты. Обе функции работают с объектами Date или значениями, которые могут быть приведены к дате, и возвращают булево значение, отражающее результат сравнения.

Основная логика построена на сравнении временных меток в миллисекундах, получаемых через внутреннее представление Date.getTime().


isBefore

Назначение

Функция isBefore определяет, является ли первая дата строго раньше второй.

Сигнатура

isBefore(date, dateToCompare)

Параметры

  • date — дата, которая проверяется
  • dateToCompare — дата, с которой выполняется сравнение

Возвращаемое значение

  • true — если date меньше dateToCompare
  • false — если date больше или равна dateToCompare

Принцип работы

Сравнение основано на числовом значении времени:

const timeA = new Date(date).getTime()
const timeB = new Date(dateToCompare).getTime()

timeA < timeB

Если результат истинный, первая дата считается более ранней.


Примеры использования

Простое сравнение дат

import { isBefore } from 'date-fns'

const result = isBefore(
  new Date(2024, 0, 1),
  new Date(2024, 0, 10)
)

console.log(result) // true

Проверка временных отметок

import { isBefore } from 'date-fns'

const start = new Date('2024-06-01T10:00:00')
const end = new Date('2024-06-01T12:00:00')

isBefore(start, end) // true

Особенности поведения

  • равные даты возвращают false
  • сравнение строгое, без включения равенства
  • время учитывается вплоть до миллисекунд
  • при передаче некорректных значений результат обычно равен false

isAfter

Назначение

Функция isAfter определяет, является ли первая дата строго позже второй.

Сигнатура

isAfter(date, dateToCompare)

Параметры

  • date — дата для проверки
  • dateToCompare — дата сравнения

Возвращаемое значение

  • true — если date больше dateToCompare
  • false — если date меньше или равна dateToCompare

Принцип работы

Логика эквивалентна обратному сравнению:

const timeA = new Date(date).getTime()
const timeB = new Date(dateToCompare).getTime()

timeA > timeB

Примеры использования

Сравнение будущего и прошлого

import { isAfter } from 'date-fns'

const now = new Date(2024, 5, 1)
const past = new Date(2024, 0, 1)

isAfter(now, past) // true

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

import { isAfter } from 'date-fns'

const finish = new Date('2024-06-01T18:00:00')
const deadline = new Date('2024-06-01T17:00:00')

isAfter(finish, deadline) // true

Особенности поведения

  • равные даты возвращают false
  • сравнение строгое
  • учитывается полная временная метка
  • некорректные даты приводят к false

Сравнение isBefore и isAfter

Обе функции являются симметричными по логике и используются для противоположных проверок.

Ситуация isBefore isAfter
date < compare true false
date > compare false true
date = compare false false

Работа с равенством дат

Ни одна из функций не возвращает true при совпадении значений времени.

import { isBefore, isAfter } from 'date-fns'

const a = new Date(2024, 0, 1)
const b = new Date(2024, 0, 1)

isBefore(a, b) // false
isAfter(a, b)  // false

Для проверки равенства используется отдельная логика через сравнение времени или функцию isEqual.


Влияние времени и миллисекунд

Даже минимальные различия во времени влияют на результат сравнения.

import { isBefore } from 'date-fns'

const a = new Date('2024-01-01T10:00:00.000')
const b = new Date('2024-01-01T10:00:00.001')

isBefore(a, b) // true

Поведение при работе с некорректными датами

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

import { isAfter } from 'date-fns'

isAfter('invalid-date', new Date()) // false

Такое поведение связано с тем, что внутренняя конвертация приводит к NaN, а любые сравнения с NaN дают отрицательный результат.


Использование в фильтрации массивов дат

Функции часто применяются для сортировки и отбора данных.

Фильтрация будущих дат

import { isAfter } from 'date-fns'

const dates = [
  new Date(2024, 0, 1),
  new Date(2025, 0, 1),
  new Date(2023, 0, 1)
]

const now = new Date(2024, 6, 1)

const futureDates = dates.filter(date => isAfter(date, now))

Отбор интервалов

import { isBefore, isAfter } from 'date-fns'

const date = new Date('2024-06-15')
const start = new Date('2024-06-01')
const end = new Date('2024-06-30')

const inRange =
  isAfter(date, start) &&
  isBefore(date, end)

Сравнение с нативным JavaScript

Нативное сравнение дат в JavaScript возможно через приведение к числу:

dateA < dateB
dateA > dateB

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


Временные зоны и локальное время

Сравнение выполняется на основе UTC-времени, хранящегося внутри объекта Date. Это означает, что локальная временная зона влияет только на создание даты, но не на сам процесс сравнения.

import { isBefore } from 'date-fns'

const a = new Date('2024-01-01T00:00:00+03:00')
const b = new Date('2024-01-01T00:00:00Z')

isBefore(a, b)

Результат зависит от фактического UTC-времени, а не от визуального представления строки.


Типовые сценарии применения

  • проверка просроченных задач
  • контроль временных интервалов
  • фильтрация событий по дате
  • построение календарной логики
  • сортировка данных перед отображением
  • валидация временных ограничений

Комбинирование с другими функциями date-fns

isBefore и isAfter часто используются совместно с функциями:

  • addDays
  • subDays
  • parseISO
  • startOfDay
  • endOfDay
  • isEqual

Пример комбинированной логики:

import { isAfter, isBefore, addDays } from 'date-fns'

const today = new Date()
const tomorrow = addDays(today, 1)

const check = isAfter(tomorrow, today) && isBefore(today, tomorrow)