В библиотеке Luxon работа с датами и временем строится вокруг
иммутабельных объектов, которые могут находиться в двух состояниях:
корректном и некорректном. В отличие от встроенного объекта
Date, где некорректная дата часто «маскируется» под
валидное значение Invalid Date, Luxon явно фиксирует
состояние валидности через внутренние флаги и свойства.
Каждый экземпляр DateTime и Duration
содержит встроенную информацию о том, может ли он считаться корректным
результатом вычисления или парсинга. Это позволяет выстраивать
предсказуемую модель обработки ошибок без исключений.
DateTime.isValidКлючевым инструментом проверки является свойство:
DateTime.isValidОно возвращает булево значение:
true — объект корректен и может использоваться в
операцияхfalse — объект содержит ошибку и считается
невалиднымПример логики:
import { DateTime } from "luxon";
const dt1 = DateTime.now();
console.log(dt1.isValid); // true
Любая операция над датами в Luxon предполагает, что результат также может оказаться невалидным:
const dt2 = DateTime.fromISO("2024-13-40");
console.log(dt2.isValid); // false
Luxon не выбрасывает исключения при ошибках парсинга — вместо этого создаёт объект с флагом невалидности.
invalidReason и
invalidExplanationДля диагностики ошибок используются два свойства:
invalidReason — краткий код причиныinvalidExplanation — человекочитаемое описаниеПример:
const dt = DateTime.fromISO("2024-13-40");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // 'unparsable'
console.log(dt.invalidExplanation); // 'the input could not be parsed as a valid ISO date'
invalidReasonЧаще всего встречаются:
unparsable — строка не может быть распознанаinvalid input — переданы некорректные аргументыunsupported zone — неподдерживаемая временная зонаmissing field — отсутствуют обязательные поляout of range — значение выходит за допустимые
границыЭти причины позволяют быстро классифицировать ошибку без дополнительного анализа входных данных.
DateTimeDateTime.fromISO("2025-02-30");
Февраль не содержит 30 дней, поэтому результат будет невалидным.
const dt = DateTime.fromISO("2025-02-30");
dt.isValid; // false
DateTime.fromObject({
year: 2024,
month: 13,
day: 10
});
Здесь month: 13 выходит за пределы допустимого
диапазона.
fromFormatDateTime.fromFormat("31-02-2024", "dd-MM-yyyy");
Даже если строка соответствует формату, логическая ошибка даты приводит к невалидности результата.
DateTime.fromJSDate(new Date("invalid date"));
Если исходный Date невалиден, Luxon наследует это
состояние.
Методы парсинга в Luxon зависят от строгости формата.
fromISO предполагает строгий формат ISO-8601. Любые
отклонения приводят к isValid = false.
DateTime.fromISO("2024/01/01"); // невалидно
fromFormat зависит от маски:
DateTime.fromFormat("2024-01-01", "dd/MM/yyyy");
Здесь формат не совпадает со строкой, поэтому результат невалиден.
Некоторые методы позволяют ослабить или изменить поведение:
DateTime.fromFormat("32/01/2024", "dd/MM/yyyy", { lenient: true });
Однако даже в «мягком» режиме логически невозможные даты всё равно могут стать причиной невалидного объекта.
Luxon строго контролирует диапазоны компонентов даты.
Пример переполнения:
DateTime.fromObject({
year: 2024,
month: 1,
day: 1,
hour: 25
});
Результат может быть либо нормализован, либо признан невалидным в зависимости от контекста создания.
Luxon активно использует IANA Time Zone Database.
DateTime.fromObject(
{ zone: "Europe/InvalidCity" }
);
Если зона не существует:
isValid = falseinvalidReason = "unsupported zone"UTCEurope/BerlinAsia/AlmatyПомимо DateTime, объект Duration также
поддерживает проверку валидности.
import { Duration } from "luxon";
const d = Duration.fromObject({ hours: 2, minutes: -10 });
console.log(d.isValid);
Некорректные комбинации могут привести к невалидному состоянию, например:
Любая операция с DateTime потенциально может вернуть
невалидный результат:
const result = DateTime.fromISO("2024-02-30").plus({ days: 1 });
Если исходный объект невалиден:
result.isValid; // false
Luxon не «чинит» невалидные даты автоматически — цепочка операций сохраняет состояние ошибки.
if (!dt.isValid) {
// обработка ошибки
}
if (!dt.isValid) {
console.log(dt.invalidReason);
console.log(dt.invalidExplanation);
}
const safeDate = dt.isValid ? dt : DateTime.now();
Любая цепочка методов сохраняет невалидность:
const dt = DateTime.fromISO("invalid")
.plus({ days: 2 })
.set({ year: 2025 });
console.log(dt.isValid); // false
Даже если последующие операции корректны, исходная ошибка «приклеивается» к объекту.
В JavaScript Date:
new Date("invalid"); // Invalid Date
Особенности:
isValidisNaN(date.getTime())Luxon:
isValidDateTime.fromISO("2024-99-99")
unparsableDateTime.now().setZone("Mars/Phobos");
unsupported zoneDateTime.fromFormat("2024-01-01", "MM-dd-yyyy");
unparsableНекоторые методы зависят от локали при разборе форматов:
DateTime.fromFormat("31/01/2024", "dd/MM/yyyy", { locale: "en" });
Неправильное соответствие локали и формата может привести к невалидности, особенно при неоднозначных датах.
Luxon допускает арифметику над датами:
const dt = DateTime.now().plus({ months: 1 });
Однако:
При создании через fromObject важно учитывать:
Пример:
DateTime.fromObject({
year: "2024",
month: "февраль",
day: null
});
Результат:
isValid = falseinvalid inputПри работе с внешними API часто встречаются некорректные даты:
const apiDate = "2024-02-30T10:00:00Z";
const dt = DateTime.fromISO(apiDate);
if (!dt.isValid) {
// фильтрация или замена значения
}
Luxon позволяет централизованно фильтровать некорректные данные без исключений и try/catch конструкций.
Невалидный объект распространяет своё состояние:
const a = DateTime.fromISO("invalid");
const b = DateTime.now();
const c = a > b; // некорректное сравнение
Такие операции не имеют смысла и требуют предварительной проверки
isValid.
При вызове:
JSON.stringify(DateTime.now())
обычно сериализуется внутреннее представление, но невалидные объекты могут давать неожиданные результаты, поэтому перед сериализацией требуется проверка:
dt.isValid ? dt.toISO() : null;
Модель Luxon предполагает:
isValid перед использованиемЭто делает обработку дат детерминированной и предсказуемой даже при некорректных входных данных.