Метод DateTime.fromFormat в библиотеке Luxon
предназначен для разбора строк даты и времени по строго заданному
формату. В отличие от fromISO, который ожидает стандарт ISO
8601, fromFormat позволяет интерпретировать практически
любой строковый формат при условии, что он явно описан через шаблон
токенов.
Ключевая особенность метода — полный контроль над разбором строки. Это делает его незаменимым при работе с пользовательскими вводами, логами, внешними API и любыми нестандартными форматами даты.
DateTime.fromFormat(text, format, options?)
Метод сопоставляет входную строку с набором токенов формата. Каждый токен описывает отдельную часть даты:
Если строка строго соответствует шаблону — возвращается корректный
объект DateTime. Если нет — результатом будет
Invalid DateTime.
import { DateTime } from "luxon";
const dt = DateTime.fromFormat("25-05-2026", "dd-MM-yyyy");
console.log(dt.toISODate());
В данном случае:
dd — день с ведущим нулёмMM — месяцyyyy — четырёхзначный годy — год (1–4 цифры)yy — две последние цифры годаyyyy — полный годПример:
DateTime.fromFormat("26", "yy"); // 2026 (в зависимости от pivot-логики)
DateTime.fromFormat("2026", "yyyy"); // 2026
M — месяц (1–12)MM — месяц с ведущим нулёмMMM — сокращённое название месяцаMMMM — полное название месяцаDateTime.fromFormat("May", "MMMM", { locale: "en" });
DateTime.fromFormat("05", "MM");
d — день месяцаdd — день с ведущим нулёмDateTime.fromFormat("7", "d");
DateTime.fromFormat("07", "dd");
H / HH — 24-часовой форматh / hh — 12-часовой форматm / mm — минутыs / ss — секундыa — AM/PMDateTime.fromFormat("14:30", "HH:mm");
DateTime.fromFormat("02:30 PM", "hh:mm a");
fromFormat по умолчанию работает достаточно строго:
строка должна соответствовать шаблону полностью.
DateTime.fromFormat("2026/05/25", "dd-MM-yyyy");
Результат: Invalid DateTime, так как разделители и порядок не совпадают.
Один из ключевых аспектов fromFormat — зависимость от
локали при разборе текстовых месяцев и дней недели.
DateTime.fromFormat("mai", "MMM", { locale: "fr" });
Без корректной локали строка может быть не распознана.
DateTime.fromFormat("février 2026", "MMMM yyyy", { locale: "fr" });
E — день недели (числовой)EEE — сокращённое названиеEEEE — полное названиеDateTime.fromFormat("Monday", "EEEE", { locale: "en" });
zoneПозволяет задать временную зону при парсинге:
DateTime.fromFormat("25-05-2026 10:00", "dd-MM-yyyy HH:mm", {
zone: "Europe/Paris"
});
Если зона не указана, используется локальная зона окружения.
setZoneПозволяет сохранить или переопределить зону из входных данных:
DateTime.fromFormat("2026-05-25 10:00+03:00", "yyyy-MM-dd HH:mmZZ", {
setZone: true
});
Токен Z и его вариации:
Z — смещение вида +03:00ZZ — более гибкий форматZZZ — сокращённые вариантыDateTime.fromFormat("2026-05-25 +0300", "yyyy-MM-dd ZZZZ");
fromFormat позволяет извлекать не все компоненты сразу.
Например, только дату без времени:
DateTime.fromFormat("25/05/2026", "dd/MM/yyyy");
В таком случае время устанавливается в 00:00:00.
Если строка не соответствует формату:
const dt = DateTime.fromFormat("invalid", "dd-MM-yyyy");
console.log(dt.isValid); // false
console.log(dt.invalidReason);
Основные причины:
Если формат содержит литералы, совпадающие с токенами, используется экранирование:
DateTime.fromFormat("day 25", "'day' dd");
Кавычки ' фиксируют текст как литерал.
DateTime.fromFormat(
"Report generated: 25-05-2026 at 14:30",
"'Report generated:' dd-MM-yyyy 'at' HH:mm"
);
S, SS, SSS —
миллисекундыDateTime.fromFormat("14:30:12.345", "HH:mm:ss.SSS");
При использовании yy Luxon применяет алгоритм
интерпретации века:
DateTime.fromFormat("26", "yy"); // может интерпретироваться как 2026
DateDateTime.fromFormat(userInput, "dd.MM.yyyy");
DateTime.fromFormat(logLine, "yyyy/MM/dd HH:mm:ss");
DateTime.fromFormat(apiDate, "MM-dd-yyyy HH:mm");
fromFormat медленнее fromISODateTime.fromFormat("2026-05-25", "dd/MM/yyyy");
DateTime.fromFormat("mai", "MMM"); // может не сработать без locale
DateTime.fromFormat("05-2026-25", "dd-MM-yyyy"); // ошибка структуры
При проектировании формата для fromFormat
рекомендуется:
MM/dd/yyyy
без контекста)Если часть данных отсутствует, Luxon не заполняет их автоматически:
DateTime.fromFormat("25-05-2026", "dd-MM-yyyy"); // время = 00:00
Luxon использует григорианский календарь, и fromFormat
интерпретирует входные данные в его рамках. Нестандартные календарные
системы не поддерживаются напрямую через этот метод.