В библиотеке Day.js валидность даты является строго определяемым состоянием объекта. Любая дата внутри системы представляется как immutable-объект, который либо содержит корректное время, либо помечается как невалидный результат парсинга.
Ключевая особенность заключается в том, что невалидная дата не выбрасывает исключение. Вместо этого создаётся объект, внутри которого хранится состояние ошибки, а дальнейшие операции продолжают выполняться, возвращая ожидаемо «сломанные» результаты.
Основной инструмент проверки:
dayjs(date).isValid()
Метод возвращает:
true — дата корректно распознана и может использоваться
в вычисленияхfalse — результат парсинга некорректен или дата не
существуетПримеры:
import dayjs from 'dayjs'
dayjs('2024-05-20').isValid() // true
dayjs('invalid-date').isValid() // false
dayjs(null).isValid() // false
dayjs(undefined).isValid() // false
Важно учитывать, что проверка всегда выполняется на уровне объекта Day.js, а не исходной строки.
При создании некорректной даты:
const d = dayjs('not-a-date')
библиотека:
false"Invalid Date" при
форматированииПример:
const d = dayjs('not-a-date')
d.format('YYYY-MM-DD') // "Invalid Date"
d.toString() // "Invalid Date"
d.isValid() // false
Таким образом, объект остаётся цепочечным, но его вычислительная ценность отсутствует.
dayjs('31-02-2024').isValid() // false
Причина — отсутствие строгого понимания формата без дополнительного парсера.
dayjs('2024-02-30').isValid() // false
dayjs('2023-13-10').isValid() // false
Февраль не содержит 30 дней, а месяц 13 не существует.
dayjs(null).isValid() // false
dayjs(undefined).isValid() // false
Такие значения не приводятся к корректной дате.
dayjs(NaN).isValid() // false
По умолчанию Day.js использует небуквальный (loose) парсинг,
основанный на встроенном Date.
Это означает:
dayjs('2024-01-01') // обычно валидно
dayjs('2024/01/01') // зависит от окружения
Разные окружения (браузер / Node.js) могут интерпретировать строки по-разному, что делает проверку валидности критически важной.
Для детерминированной проверки используется плагин
customParseFormat:
import dayjs from 'dayjs'
import customParseFormat from 'dayjs/plugin/customParseFormat'
dayjs.extend(customParseFormat)
Пример строгой проверки:
dayjs('31-12-2024', 'DD-MM-YYYY', true).isValid() // true
dayjs('31-02-2024', 'DD-MM-YYYY', true).isValid() // false
Третий параметр true включает строгий режим:
Любая операция над датой сохраняет флаг валидности:
const d = dayjs('invalid-date').add(1, 'day')
d.isValid() // false
Даже после арифметических операций объект остаётся невалидным, если исходная база была ошибочной.
Встроенный Date ведёт себя иначе:
new Date('invalid-date') // Invalid Date (но объект существует)
Различие:
Date не имеет метода isValidisNaN(date.getTime())В Day.js проверка стандартизирована:
dayjs(date).isValid()
const d = dayjs(input)
if (d.isValid()) {
console.log(d.format('YYYY-MM-DD'))
}
function safeDate(value) {
const d = dayjs(value)
return d.isValid() ? d : null
}
const dates = ['2024-01-01', 'bad-date', '2024-03-10']
const validDates = dates.filter(d => dayjs(d).isValid())
dayjs('invalid') ? true : false // всегда true (ошибка логики)
Любой вызов dayjs() возвращает объект, поэтому проверка
без isValid() некорректна.
dayjs('31/12/2024').isValid() // может быть false
Без явного формата такие строки часто интерпретируются неверно.
dayjs('1710000000000').isValid() // может трактоваться как строка
dayjs(1710000000000).isValid() // корректно как timestamp
dayjs('broken').format('YYYY-MM-DD') // "Invalid Date"
Любой формат возвращает строку "Invalid Date",
независимо от шаблона.
Это позволяет унифицировать обработку ошибок на уровне UI и логики отображения.
Некоторые плагины не изменяют правила валидности, но расширяют способы создания даты:
customParseFormat — строгий парсингutc — работа с UTC-временемtimezone — учёт часовых поясовОднако итоговое правило остаётся неизменным: валидность определяется
через isValid() на итоговом объекте.
const result = dayjs(input)
.add(2, 'day')
.subtract(1, 'month')
if (result.isValid()) {
// безопасное использование
}
Цепочки операций не требуют промежуточных проверок, если исходное значение уже гарантированно валидно.