В библиотеке Luxon разбор (parsing) временных значений строится
вокруг строгой модели DateTime. Любая входная строка или
объект преобразуется в внутреннее представление, которое либо становится
валидным экземпляром даты-времени, либо фиксируется как невалидное
состояние. Ошибки при разборе не выбрасываются как исключения, а
выражаются через флаг isValid и диагностическое поле
invalidReason, что делает модель поведения предсказуемой,
но требует внимательного анализа результата.
В основе обработки входных данных лежит принцип: любое несоответствие формату не приводит к аварийному завершению, а маркирует объект как невалидный.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2024-13-40");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // 'unparsable'
Основные причины, по которым разбор завершается неудачно:
Метод fromISO является наиболее часто используемым
механизмом, однако он чувствителен к строгому соответствию стандарту ISO
8601.
DateTime.fromISO("2024-02-30"); // невалидная дата
DateTime.fromISO("2024-02-10T25:00:00"); // неверный час
Типовые проблемы:
Февраль, апрель, июнь, сентябрь, ноябрь имеют ограниченное число дней. Переполнение приводит к невалидному результату, а не к автоматической нормализации.
Часы должны находиться в диапазоне 0–23, минуты и секунды — 0–59. Значения вне диапазона делают результат невалидным.
Метод fromFormat требует точного соответствия шаблону.
Любое отклонение ломает разбор.
DateTime.fromFormat("31/12/2024", "yyyy-MM-dd"); // invalid
Ключевые источники ошибок:
Особенно критичны текстовые месяцы:
DateTime.fromFormat("31 Dec 2024", "dd MMM yyyy", { locale: "fr" });
При несовпадении локали сокращения месяцев перестают распознаваться.
Luxon опирается на IANA Time Zone Database. Любая некорректная зона приводит к невалидному объекту.
DateTime.fromISO("2024-01-01T10:00", { zone: "Europe/Nowhere" });
Типовые причины:
В таких случаях поле invalidReason обычно содержит
значение unsupported zone.
При использовании fromJSDate ошибки возникают не в
формате строки, а на уровне переданного объекта.
DateTime.fromJSDate("2024-01-01"); // строка вместо Date
Критические случаи:
DateInvalid DateLuxon не выполняет автоматическое исправление типов.
Некоторые входные значения не вызывают явной ошибки, но приводят к
неожиданным результатам. Это не всегда отражается через
invalidReason, но проявляется в логике вычислений.
DateTime.fromISO("2024-02-29"); // валидно только в високосный год
Если дата формально существует, но логика приложения ожидает иные ограничения, ошибка становится семантической, а не синтаксической.
Локаль влияет на интерпретацию строковых форматов.
DateTime.fromFormat("01-12-2024", "dd-MM-yyyy", { locale: "en" });
DateTime.fromFormat("01-12-2024", "dd-MM-yyyy", { locale: "ru" });
Проблемные ситуации:
При несоответствии локали результат становится невалидным без явной ошибки.
Поле invalidReason используется для классификации ошибок
разбора:
unparsable — строка не распознанаinvalid input — некорректный тип входных данныхunsupported zone — неподдерживаемая временная зонаconflicting specification — противоречивые
параметрыconst dt = DateTime.fromFormat("2024/31/12", "yyyy-MM-dd");
console.log(dt.invalidReason);
Это позволяет разделять синтаксические ошибки и ошибки конфигурации.
Ошибки часто возникают не на этапе первичного разбора, а при последовательных преобразованиях:
const dt = DateTime.fromISO("2024-01-01")
.setZone("invalid-zone")
.toFormat("yyyy-MM-dd");
В таких цепочках:
isValidНекоторые операции приводят к неочевидной потере информации:
DateTime.fromISO("2024-01-01T00:30", { zone: "UTC" })
.setZone("Asia/Almaty");
Такие преобразования могут не вызывать ошибок, но изменяют смысл данных.
Luxon поддерживает неполные строки только при определённых форматах. Частичные данные часто становятся источником невалидных объектов:
DateTime.fromISO("2024-01"); // может интерпретироваться неоднозначно
Проблемы:
Ключевая особенность модели заключается в отсутствии throw-ошибок при разборе. Это приводит к необходимости явной проверки:
const dt = DateTime.fromISO("invalid-date");
if (!dt.isValid) {
// обработка ошибки разбора
}
Игнорирование этого свойства приводит к накоплению скрытых дефектов в данных и последующим логическим ошибкам в вычислениях времени.