В работе с датами в JavaScript одной из ключевых проблем остаётся
отсутствие строгой валидации при создании объектов времени. Библиотека
Luxon решает эту задачу через модель неизменяемых объектов
DateTime, каждый из которых может находиться в состоянии
корректной или некорректной даты.
С точки зрения Luxon, «существование даты» не означает её наличие в
календаре как абстрактного факта, а означает валидность внутреннего
представления времени. Любая операция создания даты возвращает объект
DateTime, который всегда существует как экземпляр, но может
быть помечен как недействительный.
Главный механизм проверки существования даты — свойство:
DateTime.isValidЭто булево значение, которое указывает, корректно ли был создан объект.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2025-02-30");
console.log(dt.isValid); // false
Несмотря на то, что объект dt существует, сама дата не
существует в календарном смысле, поскольку 30 февраля не может быть
корректно интерпретировано.
Таким образом, в Luxon важно различать:
DateTimeLuxon предоставляет детальную диагностику причин, по которым дата считается несуществующей.
const dt = DateTime.fromISO("invalid-string");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // "unparsable"
Основные значения invalidReason:
"unparsable" — строка не может быть разобрана"invalid input" — переданы некорректные параметры"unsupported zone" — неподдерживаемая временная
зона"missing field" — отсутствуют обязательные поля"out of range" — значения выходят за допустимые
пределыДля более подробной диагностики используется:
console.log(dt.invalidExplanation);
Это человекочитаемое описание причины, например:
Наиболее распространённый способ создания даты:
const dt = DateTime.fromISO("2025-12-10");
if (!dt.isValid) {
// дата не существует
}
Luxon автоматически проверяет корректность календарных значений:
DateTime.fromISO("2024-02-29").isValid; // true (високосный год)
DateTime.fromISO("2023-02-29").isValid; // false
Таким образом, проверка существования даты автоматически учитывает календарные правила.
Luxon позволяет создавать даты через объект:
const dt = DateTime.fromObject({
year: 2025,
month: 13,
day: 10
});
Здесь возникает проверка диапазонов:
console.log(dt.isValid); // false
Причина:
Luxon строго контролирует диапазоны:
Любое нарушение приводит к невалидной дате.
Некорректная дата может появиться не только при создании, но и при преобразованиях.
const dt = DateTime.fromISO("2025-01-31").plus({ months: 1 });
console.log(dt.toISO());
Результат зависит от стратегии нормализации:
Одной из частых причин несуществующих дат является зона времени.
const dt = DateTime.fromISO("2025-06-10T12:00", {
zone: "invalid-zone"
});
console.log(dt.isValid); // false
Luxon фиксирует:
const dt = DateTime.fromFormat("31-02-2025", "dd-MM-yyyy");
console.log(dt.isValid); // false
Здесь проверка происходит в два этапа:
Важно различать три состояния:
let dt;
Дата не существует как переменная.
const dt = null;
Явное отсутствие объекта.
const dt = DateTime.fromISO("2025-02-30");
Объект существует, но дата невалидна:
dt.isValid; // false
При работе с массивами дат часто требуется фильтрация:
const dates = [
DateTime.fromISO("2025-01-10"),
DateTime.fromISO("2025-02-30"),
DateTime.fromISO("2025-03-15")
];
const validDates = dates.filter(d => d.isValid);
Такой подход позволяет безопасно отделить реально существующие даты от некорректных значений.
Любая операция с датой должна учитывать валидность:
function formatDate(dt) {
if (!dt.isValid) {
return "invalid date";
}
return dt.toFormat("dd.MM.yyyy");
}
Luxon не выбрасывает исключение при создании невалидной даты, поэтому проверка обязательна.
При операциях сложения и вычитания Luxon стремится сохранить валидность:
const dt = DateTime.fromISO("2025-01-31").plus({ months: 1 });
console.log(dt.isValid);
Если корректная нормализация невозможна, объект становится
невалидным, и это фиксируется через isValid.
При неполных данных Luxon может заполнить отсутствующие поля:
const dt = DateTime.fromObject({ year: 2025 });
console.log(dt.isValid); // true
Но при отсутствии критических полей (например, невозможность определить дату в конкретном контексте) объект становится невалидным.
const input = "31/04/2025";
const dt = DateTime.fromFormat(input, "dd/MM/yyyy");
if (!dt.isValid) {
// дата не существует
}
function parseEvent(data) {
const start = DateTime.fromISO(data.start);
if (!start.isValid) {
return null;
}
return start;
}
const range = dates.filter(d =>
d.isValid && d.year === 2025
);
Для глубокого анализа используется связка:
isValidinvalidReasoninvalidExplanationconst dt = DateTime.fromISO("2025-02-30");
if (!dt.isValid) {
console.log(dt.invalidReason);
console.log(dt.invalidExplanation);
}
Это позволяет точно определить источник ошибки: формат, диапазон или зона времени.
Luxon сохраняет неизменяемость объектов:
const dt1 = DateTime.fromISO("2025-02-30");
const dt2 = dt1.plus({ days: 1 });
console.log(dt1.isValid); // false
console.log(dt2.isValid); // false
Если исходная дата не существует, все производные значения также считаются невалидными.
Общий подход к проверке существования даты строится вокруг
единственного правила: любая дата должна быть проверена через
isValid до дальнейшего использования.
function safeDate(input) {
const dt = DateTime.fromISO(input);
return dt.isValid ? dt : null;
}
Такой подход исключает попадание несуществующих дат в бизнес-логику и обеспечивает предсказуемость обработки времени.