В библиотеке Luxon обработка строковых представлений дат опирается на
строго определённые форматы и правила интерпретации. Любое отклонение от
ожидаемого шаблона приводит не к «догадкам», а к формированию
недопустимого или частично интерпретированного объекта
DateTime, что часто воспринимается как неправильный разбор
строки.
Основной принцип работы Luxon при преобразовании строк заключается в
отказе от неявных предположений. В отличие от стандартного
Date.parse, который может интерпретировать неоднозначные
строки по-разному в разных средах, Luxon требует явного указания
формата.
Ключевые методы:
DateTime.fromISO()DateTime.fromRFC2822()DateTime.fromSQL()DateTime.fromFormat()Каждый из них работает только с определённым классом строк. Попытка передать неподдерживаемый формат приводит к созданию объекта:
DateTime.invalidМетод DateTime.fromISO() ожидает строго соответствующий
ISO 8601 формат. Любые отклонения приводят к некорректному разбору.
Корректные примеры:
2026-05-242026-05-24T15:30:002026-05-24T15:30:00+06:00Типичные ошибки:
TПример проблемной строки:
2026/05/24 15:30Такая строка не является ISO и не будет корректно интерпретирована
через fromISO, даже если стандартный JavaScript
Date её примет.
Метод DateTime.fromFormat() требует точного соответствия
строкового представления шаблону, заданному разработчиком.
Например:
DateTime.fromFormat("24-05-2026 15:30", "dd-MM-yyyy HH:mm")
Любое несоответствие:
приводит к недопустимому результату.
Особенность заключается в том, что Luxon не пытается «починить» строку, а просто возвращает невалидный объект.
Некоторые ошибки не связаны с очевидным несоответствием формата, но приводят к неправильному разбору строки.
При использовании fromFormat() локаль влияет на
интерпретацию месяцев и дней недели.
Например:
"янв" может быть валидным в русской локалиen-USЕсли локаль не установлена явно, используется системная или дефолтная, что создаёт нестабильность поведения.
Luxon использует системный часовой пояс или Zone по
умолчанию. При парсинге строки без зоны:
2026-05-24T10:00результат зависит от текущей конфигурации окружения.
Это приводит к смещению времени без явного уведомления о проблеме, что визуально воспринимается как «неправильный разбор».
При попадании времени в «несуществующий» часовой диапазон (например, во время перехода часов):
Luxon не корректирует такие значения произвольно, что отличается от поведения более «гибких» парсеров.
Некоторые форматы могут быть частично распознаны, но при этом часть информации игнорируется.
Пример:
DateTime.fromISO("2026-05-24 15:30")
Хотя строка похожа на ISO, пробел вместо T делает её
некорректной. В результате:
Такие случаи особенно опасны, так как визуально результат может выглядеть корректным.
Любой результат парсинга требует проверки:
isValidinvalidReasoninvalidExplanationТиповые причины:
unparsableinvalid inputout of rangeИгнорирование этих свойств приводит к распространению некорректных дат по всей системе.
Каждый метод Luxon интерпретирует строки по-своему:
fromISO() — строгий ISO 8601fromRFC2822() — почтовые и HTTP-форматыfromSQL() — SQL DATETIME / TIMESTAMPfromFormat() — пользовательский шаблонОшибка выбора метода приводит к систематически неправильному разбору, даже если строка визуально «похожа» на корректную.
В отличие от стандартного JavaScript поведения:
new Date("24-05-2026")
Luxon не выполняет неявных преобразований. Строка:
Это исключает случайные ошибки, но усиливает требования к точности входных данных.
invalid
объектамиПри неудачном разборе возвращается объект DateTime, у
которого:
isValid = falseТакой объект продолжает участвовать в цепочках вызовов, что может маскировать проблему:
DateTime.fromISO("invalid-date").plus({ days: 1 })
Результат остаётся invalid, но без явного выброса исключения.
Luxon является иммутабельным, поэтому каждая операция создаёт новый объект. При этом invalid-объект распространяется по всей цепочке:
Ошибка, возникшая на этапе парсинга, сохраняется до финального шага, если не проверена заранее.
Наиболее проблемные строки:
05/06/2026 (неясно: май или июнь)2026-05-24 10:00:00 (не ISO)24.05.2026 (локальный формат)20260524 (компактный формат без разделителей)Такие строки требуют строгого соответствия fromFormat,
иначе интерпретация невозможна.
Luxon чувствителен к структуре строки:
/ вместо -)MM vs
mm)Ошибки в этих деталях приводят к полному отказу парсинга, а не к частичному исправлению.
При несовпадении формата Luxon:
invalid DateTimeЭто делает ошибки менее заметными, но более предсказуемыми при системной обработке дат.