В библиотеке Luxon ключевым объектом для работы со временем является
DateTime. Почти каждая операция — парсинг строки,
преобразование часовых поясов, арифметика дат — может вернуть корректный
объект либо специальное состояние «невалидности». Невалидный
DateTime не является ошибкой в виде исключения: он
создаётся и возвращается как объект, внутри которого зафиксирована
причина невозможности построения корректного значения.
Основные признаки невалидного значения:
DateTime.isValid === falseDateTime.invalidReason содержит тип причиныDateTime.invalidExplanation содержит текстовое
пояснениеТакой подход позволяет не прерывать поток выполнения и явно диагностировать проблему.
Наиболее частая причина — попытка создать дату из строки, не соответствующей ожидаемым форматам ISO или пользовательскому формату.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2024-13-40");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // 'unparsable'
Типичные случаи:
Luxon строго контролирует календарные значения. Даже если строка формально похожа на дату, логическая некорректность приводит к невалидности.
DateTime.fromObject({ year: 2024, month: 0, day: 10 });
Причины:
В этом случае invalidReason часто принимает
значение:
unit out of rangeРабота с временными зонами — один из источников невалидных значений.
DateTime.fromObject(
{ year: 2024, month: 5, day: 10 },
{ zone: "Mars/Phobos" }
);
Если зона не распознана:
invalidReason = "unsupported zone"Типичные проблемы:
При создании объекта через fromObject или
set могут возникать противоречивые комбинации.
DateTime.fromObject({
year: 2024,
ordinal: 400
});
Здесь одновременно заданы несовместимые представления даты (календарная и порядковая).
Возможные причины:
Luxon опирается на встроенный Date. Если он не может
быть построен, результат становится невалидным.
const dt = DateTime.fromJSDate(new Date("invalid"));
console.log(dt.isValid); // false
Причины:
NaN внутри JS DateМетод fromISO требует строгого соответствия
стандарту.
Ошибки:
/ вместо -)DateTime.fromISO("2024-05-40T10:00");
Результат:
invalidReason = "unparsable"При использовании fromHTTP, fromRFC2822
возможны ошибки разбора:
При fromFormat критично совпадение шаблона и строки.
DateTime.fromFormat("32-01-2024", "dd-MM-yyyy");
Причины невалидности:
Хотя Duration менее строг, он также может стать
невалидным.
import { Duration } from "luxon";
const d = Duration.fromObject({ hours: "x" });
console.log(d.isValid); // false
Причины:
Interval становится невалидным, если нарушена структура
границ.
import { DateTime, Interval } from "luxon";
const start = DateTime.fromISO("2024-05-10");
const end = DateTime.fromISO("invalid");
const interval = Interval.fromDateTimes(start, end);
console.log(interval.isValid); // false
Основные причины:
Внутренний механизм Luxon классифицирует ошибки через строковые коды:
unparsable — строка не может быть разобранаunit out of range — значение выходит за пределы
календаряunsupported zone — неизвестная временная зонаconflicting specifications — противоречивые входные
данныеЭти значения позволяют быстро определить источник проблемы без анализа всей цепочки вычислений.
Любая операция над невалидным DateTime сохраняет его
состояние:
const dt = DateTime.fromISO("invalid");
const shifted = dt.plus({ days: 5 });
console.log(shifted.isValid); // false
Особенность модели:
Помимо кода причины, Luxon предоставляет текстовое пояснение:
const dt = DateTime.fromISO("2024-13-10");
console.log(dt.invalidExplanation);
Использование:
Невалидность в Luxon — не исключение и не сбой выполнения, а часть модели данных. Она возникает как результат строгой проверки входных параметров и распространяется через все операции, сохраняя информацию о первоначальной причине.
Такой подход формирует предсказуемое поведение: