В библиотеке Luxon некорректный формат возникает в момент, когда
входная строка или структура данных не соответствует ожидаемому шаблону
парсинга. В отличие от стандартного Date в JavaScript,
который при ошибке часто возвращает Invalid Date без
подробностей, Luxon формирует объект DateTime с расширенной
диагностикой состояния ошибки.
Некорректный формат не является исключением в классическом смысле.
Это валидный объект DateTime, находящийся в состоянии
неуспешного разбора.
Наиболее частая причина — отклонение от стандарта ISO 8601.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2024-13-40T25:61:00");
Строка синтаксически похожа на ISO, но содержит невозможные значения:
Результат:
dt.isValid // false
fromFormatМетод fromFormat зависит от строгого соответствия
шаблону.
const dt = DateTime.fromFormat("31/02/2024", "dd/MM/yyyy");
Здесь формат соответствует шаблону, но дата не существует (февраль не содержит 31 день).
Результат не будет выбрасывать ошибку, но объект станет невалидным.
Форматы, зависящие от локали, часто приводят к некорректному разбору.
const dt = DateTime.fromFormat("12 janvier 2024", "d MMMM yyyy", {
locale: "en"
});
Если локаль не соответствует входной строке, месяц не распознаётся.
Некоторые форматы выглядят корректными, но не поддерживаются парсером Luxon:
DateTime.fromISO("2024-05-20 10:00:00") // пробел вместо T
Хотя многие библиотеки это допускают, Luxon строго следует ISO.
При некорректном формате Luxon не возвращает null или
undefined. Вместо этого создаётся объект со следующими
свойствами:
isValid: falseinvalidReason: stringinvalidExplanation: stringПример:
const dt = DateTime.fromISO("2024-99-99");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // "unparsable"
console.log(dt.invalidExplanation); // более подробное описание
Возникает, когда строка не может быть разобрана вообще:
DateTime.fromISO("not-a-date")
Типичный случай:
Появляется, когда структура распознана, но значения невозможны:
DateTime.fromObject({ year: 2024, month: 13, day: 10 });
Возникает при неполных данных:
DateTime.fromObject({ year: 2024 });
Без месяца и дня невозможно построить полноценную дату.
Часто связан с fromFormat:
DateTime.fromFormat("2024/05/20", "dd-MM-yyyy");
Формат не соответствует входной строке.
Строго проверяет ISO-8601.
DateTime.fromISO("2024-05-20T10:00:00").isValid; // true
DateTime.fromISO("2024/05/20").isValid; // false
Зависит от шаблона:
DateTime.fromFormat("20-05-2024", "dd-MM-yyyy");
Любое отклонение приводит к invalid.
Строго проверяет диапазоны значений:
DateTime.fromObject({
year: 2024,
month: 0,
day: 10
});
Месяц 0 — недопустим.
Ошибки возникают при NaN:
DateTime.fromMillis(NaN).isValid; // false
Основной механизм контроля:
const dt = DateTime.fromISO("invalid");
if (!dt.isValid) {
console.log(dt.invalidReason);
}
isValid — главный индикаторinvalidReason — тип ошибкиinvalidExplanation — подробное описаниеНаиболее частая причина — текстовые поля:
DateTime.fromFormat(userInput, "dd.MM.yyyy");
Ошибки:
API часто возвращают неоднородные форматы:
{
"date": "2024-05-20 10:00:00"
}
Luxon ожидает ISO:
DateTime.fromISO(api.date);
Некорректный формат может появляться при ошибках временных зон:
DateTime.fromISO("2024-05-20T10:00:00", { zone: "invalid-zone" });
Luxon не пытается «угадать» формат. Это принципиальное отличие от более гибких библиотек.
Сравнение поведения:
DateTime с
isValid: falseconst dt = DateTime.fromISO(input);
if (!dt.isValid) {
return null;
}
let dt = DateTime.fromISO(input);
if (!dt.isValid) {
dt = DateTime.fromFormat(input, "dd.MM.yyyy");
}
const dates = ["2024-01-01", "invalid", "2024-02-01"];
const validDates = dates
.map(d => DateTime.fromISO(d))
.filter(dt => dt.isValid);
Поле invalidExplanation предназначено для диагностики и
содержит человекочитаемое описание.
Пример:
const dt = DateTime.fromISO("2024-99-99");
console.log(dt.invalidExplanation);
Типичные варианты:
Некорректный формат распространяется по цепочке методов:
const dt = DateTime.fromISO("invalid")
.plus({ days: 2 })
.toISO();
Результат:
isValid: falseНекорректный формат часто проявляется при переходах:
JSON.stringify(DateTime.fromISO("invalid"));
Результат:
{ "invalid": true }
Важная особенность Luxon — отсутствие выбрасываемых ошибок при парсинге.
Неверный формат:
throwЭто позволяет безопасно обрабатывать массовые данные без try/catch.
const cleaned = input.trim();
const dt = DateTime.fromISO(cleaned);
function parseDate(input) {
return DateTime.fromISO(input) ||
DateTime.fromFormat(input, "dd.MM.yyyy");
}
function strictParse(input) {
const dt = DateTime.fromISO(input);
if (!dt.isValid) return null;
return dt;
}
const dt = DateTime.fromISO(input);
console.log(dt.toISO()); // может быть null-результат
DateTime.fromISO("2024-13-40") // не исправляется автоматически
DateTime.fromISO("20-05-2024");
ISO не допускает таких строк.
Некорректные объекты сохраняют состояние:
const dt = DateTime.fromISO("invalid");
JSON.stringify(dt);
Результат:
{"invalid":true}
Некорректный формат может возникнуть из-за:
fromFormatDateTime.fromFormat("20/05/2024", "dd.MM.yyyy", {
locale: "en"
});
Любые операции над невалидным объектом сохраняют состояние:
const dt = DateTime.fromISO("invalid");
const next = dt.plus({ days: 1 });
next.isValid; // false
Структурный разбор некорректного формата включает:
Каждый уровень может привести к invalid без исключений и остановки выполнения.