Функция isValid в библиотеке date-fns предназначена для
проверки корректности даты. В JavaScript объект Date может
находиться в двух состояниях: представлять реальный момент времени или
быть «невалидным» (Invalid Date). Именно для различения этих случаев
используется isValid.
Встроенный объект Date в JavaScript не выбрасывает
исключение при создании некорректной даты. Вместо этого он создаёт
объект, внутреннее значение которого становится NaN.
new Date('invalid date') // Invalid Date
Такой объект:
DateNaN при вызове getTime()Функция isValid решает задачу определения, можно ли
считать дату валидной.
isValid(date)
date — значение типа Date, timestamp,
строка или другой объект, который приводится к дате внутри date-fnsboolean:
true — дата корректнаfalse — дата некорректнаВ основе проверки лежит анализ результата преобразования даты в числовое представление времени.
Эквивалент логики:
Number.isNaN(date.getTime())
Если значение времени не является числом — дата считается невалидной.
import { isValid } from 'date-fns'
isValid(new Date())
// true
isValid(new Date(2024, 0, 1))
// true
isValid(new Date('2024-01-01'))
// true
isValid(new Date('invalid'))
// false
isValid(new Date(NaN))
// false
isValid(new Date('2024-13-40'))
// false
Строки преобразуются через Date.parse:
isValid('2024-01-01')
// true
isValid('not a date')
// false
При этом важно учитывать, что парсинг строк зависит от реализации движка и формата.
isValid(0)
// true (Unix epoch)
isValid(1700000000000)
// true
Отрицательные значения также допустимы:
isValid(-1)
// true
isValid(new Date())
// true
isValid(new Date('bad input'))
// false
Невалидный Date:
const d = new Date('invalid')
d.toString()
// "Invalid Date"
d.getTime()
// NaN
Ключевой признак — невозможность преобразования в числовой timestamp.
const d = new Date('invalid')
Number.isNaN(d.getTime()) // true
d instanceof Date // true
Эта проверка бесполезна для валидации, так как не различает корректные и некорректные даты.
if (new Date('invalid')) {
// всегда выполнится
}
Любой объект Date является truthy.
new Date('invalid') === 'Invalid Date'
// false
Строковое представление не отражает внутреннее состояние.
Функция часто используется как защитный слой перед другими операциями.
import { isValid, format } from 'date-fns'
const date = new Date('invalid')
if (isValid(date)) {
format(date, 'yyyy-MM-dd')
}
Без проверки format может выбросить ошибку или вернуть
некорректный результат.
import { isValid, compareAsc } from 'date-fns'
const a = new Date('2024-01-01')
const b = new Date('invalid')
if (isValid(a) && isValid(b)) {
compareAsc(a, b)
}
isValid не проверяет:
Пример:
isValid(new Date('2024-02-30'))
// false
Но:
isValid(new Date('2024-02-29'))
// true (в високосный год)
isValid(new Date(1e20))
// false
isValid(new Date(-1e20))
// false
Причина — выход за допустимый диапазон timestamp.
date-fns функции часто принимают значения, которые сначала приводятся
к Date.
import { isValid, parseISO } from 'date-fns'
const date = parseISO('2024-01-01T00:00:00Z')
isValid(date)
// true
Если парсинг неудачен:
parseISO('bad string')
// Invalid Date
isValid(parseISO('bad string'))
// false
!Number.isNaN(Date.parse('2024-01-01'))
Проблема: Date.parse работает со строками, но не с
объектами Date.
moment('invalid').isValid()
В date-fns аналогом является чистая функция без состояния.
isValid используется как фильтр входных данных
перед:
Типовой паттерн:
const safeDate = (value) => {
const d = new Date(value)
return isValid(d) ? d : null
}
isValid(null)
// false
isValid(undefined)
// false
Такие значения приводятся к Invalid Date.
NaN считается невалидной