date-fns предоставляет набор функций для работы с датами, среди
которых особое место занимают проверки значений на корректность и тип.
Функции isDate и isValid часто
используются совместно, но решают принципиально разные задачи: первая
определяет принадлежность к типу Date, вторая — фактическую
корректность даты.
Функция isDate определяет, является ли переданное
значение экземпляром объекта Date.
Сигнатура:
isDate(value: unknown): boolean
Основной смысл функции — проверка структуры объекта, а не его состояния.
isDate возвращает true, если значение
создано через конструктор Date:
import { isDate } from 'date-fns';
isDate(new Date()); // true
isDate(new Date(2020, 1, 1)); // true
isDate('2020-01-01'); // false
isDate(1580515200000); // false
isDate({}); // false
Важно учитывать ключевую особенность: даже некорректная дата остаётся
объектом Date.
const invalid = new Date('invalid');
isDate(invalid); // true
Здесь функция подтверждает тип, но не валидность.
DateФункция isValid проверяет, является ли дата корректной (то есть представляет ли она реальное временное значение).
Сигнатура:
isValid(date: unknown): boolean
Функция определяет, можно ли считать значение валидной датой,
независимо от того, строка это, число или объект Date.
import { isValid } from 'date-fns';
isValid(new Date()); // true
isValid(new Date(2020, 1, 1)); // true
isValid(new Date('invalid')); // false
Также поддерживаются строки и timestamp:
isValid('2020-01-01'); // true
isValid(1580515200000); // true
isValid('not-a-date'); // false
isValid(NaN); // false
isValid пытается интерпретировать значение как дату.
Если результатом становится Invalid Date, функция
возвращает false.
Несмотря на схожее назначение, функции работают на разных уровнях проверки.
| Функция | Проверяет | Результат true означает |
|---|---|---|
| isDate | тип объекта | значение является экземпляром Date |
| isValid | корректность даты | дата существует и валидна |
const d = new Date('invalid');
isDate(d); // true
isValid(d); // false
Здесь видно, что объект существует, но временное значение некорректно.
В реальных приложениях функции часто используются вместе для точной проверки входных данных.
import { isDate, isValid } from 'date-fns';
function safeFormat(date) {
if (!isDate(date)) {
throw new Error('Ожидается объект Date');
}
if (!isValid(date)) {
throw new Error('Некорректная дата');
}
return date.toISOString();
}
Такой подход разделяет две ответственности:
isDate гарантирует типisValid гарантирует смысловое корректное значениеconst value = new Date('invalid');
if (isDate(value)) {
// ошибка: дата может быть невалидной
}
Такой код пропускает некорректные даты.
isDate('2020-01-01'); // false
Строка может быть валидной датой, но не является объектом
Date.
const d = new Date('not-a-date');
Конструктор не выбрасывает ошибку, а создаёт
Invalid Date, что требует дополнительной проверки через
isValid.
import { isValid } from 'date-fns';
function validateBirthDate(input) {
return isValid(input) && new Date(input) < new Date();
}
import { isDate, isValid } from 'date-fns';
function normalizeDate(value) {
const date = value instanceof Date ? value : new Date(value);
if (!isValid(date)) return null;
return date;
}
import { isValid } from 'date-fns';
const dates = [
new Date('2020-01-01'),
new Date('invalid'),
'2021-05-05',
1620000000000
];
const validDates = dates
.map(d => new Date(d))
.filter(isValid);
isValid(undefined); // false
isValid(NaN); // false
isValid(''); // false
isValid('2020-13-40'); // false
isValid(0); // true (1970-01-01)
isValid(-1); // true (дата до эпохи UNIX)
Логика двух функций формирует устойчивую модель обработки дат:
Такой подход снижает количество ошибок при работе с внешними источниками данных и упрощает контроль над типами и значениями в приложении.