Внутреннее представление даты и времени в Luxon основано на объекте
DateTime, который может находиться в двух состояниях:
корректном и некорректном (invalid). Любая операция создания,
преобразования или вычисления может привести к результату, который
формально является объектом DateTime, но не представляет
реальную календарную дату.
Для контроля состояния используется свойство:
isValid — булево значение, отражающее
корректность объектаЕсли isValid === false, объект считается
недействительным и большинство операций над ним возвращают предсказуемые
безопасные результаты.
Свойство isValid является основным инструментом
диагностики:
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2024-13-40");
dt.isValid; // false
В примере строка содержит некорректные значения месяца и дня. Luxon не выбрасывает исключение, а формирует объект с флагом невалидности.
Корректный случай:
const dt = DateTime.fromISO("2024-12-01");
dt.isValid; // true
При isValid === false дополнительно доступны
диагностические поля:
invalidReason — краткий код
причиныinvalidExplanation — текстовое
описаниеconst dt = DateTime.fromISO("2024-02-30");
dt.isValid; // false
dt.invalidReason; // 'unit out of range'
dt.invalidExplanation; // 'the day "30" is out of range for month "2"'
Типичные причины:
Неверные дни, месяцы, часы:
DateTime.fromObject({ year: 2024, month: 13, day: 1 });
DateTime.fromISO("not-a-date");
DateTime.fromObject({ hour: 10 }); // без даты интерпретация может быть invalid
DateTime.fromISO("2024-12-01T10:00", { zone: "Invalid/Zone" });
Luxon придерживается модели «без исключений» при работе с датами. Поэтому invalid-объекты не прерывают выполнение программы, но распространяют невалидность по цепочке.
const dt = DateTime.fromISO("2024-02-30");
const shifted = dt.plus({ days: 5 });
shifted.isValid; // false
Любая операция над невалидным объектом сохраняет состояние invalid.
isValid в цепочкахПри работе с преобразованиями проверка может выполняться на любом этапе:
const dt = DateTime.fromFormat("31/02/2024", "dd/MM/yyyy");
if (dt.isValid) {
const result = dt.toISO();
}
Однако чаще используется перенос проверки ближе к месту получения данных, поскольку все производные значения наследуют состояние исходного объекта.
isValid с форматированием и выводомНевалидные объекты не приводятся к нормальному строковому представлению календарной даты.
const dt = DateTime.fromISO("invalid");
dt.toISO(); // null
dt.toString(); // 'Invalid DateTime'
Любые методы форматирования возвращают безопасные значения:
toISO() → nulltoFormat() → пустая строка или некорректный
результатtoString() → строка с обозначением invalidinvalidReason и invalidExplanationisValid определяет факт ошибки, но не её природу. Для
анализа используется расширенная информация:
const dt = DateTime.fromObject({ year: 2024, month: 0 });
dt.isValid; // false
dt.invalidReason; // 'unit out of range'
Часто встречающиеся значения invalidReason:
unsupported zoneunparsableunit out of rangemissing fieldЭти коды позволяют классифицировать ошибки на уровне бизнес-логики.
const dt = DateTime.fromJSDate(new Date("invalid-date"));
dt.isValid; // false
const dt = DateTime.fromMillis(NaN);
dt.isValid; // false
DateTime.fromObject({ year: NaN, month: 5 }).isValid; // false
Любое некорректное числовое значение автоматически приводит к invalid-состоянию.
Invalid-объект сохраняет свою невалидность независимо от операций:
const dt = DateTime.fromISO("invalid");
const result = dt
.set({ year: 2025 })
.plus({ days: 10 })
.startOf("day");
result.isValid; // false
Это поведение обеспечивает предсказуемость: одна ошибка не маскируется последующими вычислениями.
При работе с массивами дат часто используется фильтрация:
const dates = [
DateTime.fromISO("2024-01-01"),
DateTime.fromISO("2024-02-30"),
DateTime.fromISO("2024-03-01")
];
const validDates = dates.filter(d => d.isValid);
Результатом становятся только корректные значения, без необходимости обработки исключений.
isValid от проверок через null и
undefinedLuxon не использует null как индикатор ошибки для
DateTime. Вместо этого всегда возвращается объект:
isValid === trueisValid === falseЭто исключает необходимость проверки на существование объекта:
const dt = DateTime.fromISO("bad");
dt === null; // false
dt.isValid; // false
isValid в архитектуре обработки времениИспользование isValid формирует устойчивую модель
обработки временных данных:
Такой подход позволяет разделять этапы: