В библиотеке Luxon любой объект DateTime,
Duration или Interval может оказаться в
состоянии невалидности. Это не исключение в привычном смысле, а
встроенный механизм моделирования ошибок работы с датами и временем.
Вместо выбрасывания исключений при каждом некорректном вводе Luxon
возвращает объект с флагом isValid: false, а причину
фиксирует в поле invalidReason.
Такой подход позволяет безопасно продолжать цепочки вычислений, не прерывая выполнение программы, и одновременно получать точную диагностику проблемы.
Каждый экземпляр временных сущностей Luxon содержит три ключевых элемента состояния:
isValid — булев флаг корректностиinvalidReason — краткий код причины ошибкиinvalidExplanation — расширенное текстовое
пояснениеОсновная диагностическая логика сосредоточена именно в
invalidReason, поскольку он стандартизирован и стабилен
между версиями.
Поле invalidReason устанавливается только в случае, если
объект не может быть корректно интерпретирован. При успешном создании
значения оно остаётся null.
Типовые ситуации возникновения невалидности:
Возникает при невозможности разобрать входную строку или значение.
Типичные случаи:
DateTime.fromISO("abc")DateTime.fromFormat("32-13-2020", "dd-MM-yyyy")Причина фиксируется, когда парсер не может сопоставить вход с допустимым форматом.
Появляется при передаче структурно некорректных данных в конструкторы.
Примеры:
NaN в полях времениundefined в обязательных параметрахФиксируется при выходе числовых компонентов за допустимые границы календаря.
Примеры:
Luxon не нормализует такие значения автоматически, а помечает объект как невалидный.
Возникает при отсутствии обязательных данных, необходимых для построения объекта.
Часто встречается при ручной сборке через
DateTime.fromObject.
Связан с некорректной или неизвестной временной зоной.
Примеры:
Появляется при конфликте между указанной зоной и входными данными, особенно при парсинге строк с уже встроенной временной зоной.
Специфично для Interval. Возникает, когда:
Любой невалидный объект в Luxon следует единому принципу:
isValid === false — главный индикатор ошибкиinvalidReason — код категории ошибкиinvalidExplanation — человекочитаемое описаниеЛогика всегда начинается с проверки флага:
const dt = DateTime.fromISO("not-a-date");
if (!dt.isValid) {
console.log(dt.invalidReason);
}
invalidReason никогда не используется без проверки
isValid, так как для корректных объектов он равен
null.
После создания объекта значение invalidReason:
Пример:
const dt = DateTime.fromISO("bad input")
.plus({ days: 2 })
.setZone("UTC");
Результат останется невалидным, а invalidReason
сохранится прежним.
Любая операция над невалидным объектом:
Это важно для предотвращения «тихих» ошибок в вычислениях времени.
Пример связки:
invalidReason: "unsupported zone"invalidExplanation: "zone 'Europe/Nowhere' is not recognized"В сложных вычислениях важно понимать, что Luxon фиксирует первую критическую ошибку и не пересчитывает причину дальше.
Пример:
DateTime.fromObject({
year: 2020,
month: 13,
day: 40
});
Здесь будет зафиксирован unit out of range, даже если
несколько полей некорректны одновременно.
Типичный паттерн обработки:
const dt = DateTime.fromFormat(input, "yyyy-MM-dd");
switch (dt.invalidReason) {
case "unparsable":
// обработка строки формата
break;
case "unit out of range":
// корректировка пользовательского ввода
break;
case "unsupported zone":
// fallback на UTC
break;
}
Такой подход позволяет строить устойчивые системы парсинга дат без исключений.
invalidReason появляется при:
Некоторые методы Luxon используют строгий парсинг, при котором:
Это особенно важно при работе с fromFormat и
пользовательскими строками.
На практике чаще всего встречаются:
Модель ошибок Luxon построена так, чтобы:
invalidReason является центральным элементом этой
стратегии, позволяя превращать ошибки времени в управляемое состояние
данных.