Парсинг строк в Moment.js опирается на явное указание формата входных
данных, что позволяет библиотеке интерпретировать дату и время
предсказуемо и без неоднозначностей. Основной механизм реализуется через
вызов moment(input, format) либо расширенную форму
moment(input, format, strict).
При разборе строки Moment.js сопоставляет символы входной строки с токенами формата. Каждый токен описывает конкретную часть даты или времени:
YYYY — четырёхзначный годYY — двухзначный годMM — месяц (01–12)DD — день месяцаHH — часы в 24-часовом форматеmm — минутыss — секундыСтрока анализируется последовательно, и каждое значение извлекается строго согласно позиции токенов.
const m = moment("2024-08-15", "YYYY-MM-DD");
В этом примере:
2024 интерпретируется как год08 как месяц15 как деньЕсли структура строки не совпадает с форматом, результатом становится некорректная дата.
Moment.js использует широкий набор токенов, позволяющий описывать практически любую текстовую дату:
D, DD — день месяцаDo — день месяца с порядковым суффиксом (1st, 2nd и
т.д.)M, MM — месяцMMM, MMMM — сокращённое и полное название
месяцаH, HH — часы (24h)h, hh — часы (12h)a, A — am/pmm, mm — минутыs, ss — секундыconst m = moment("15-08-2024 14:30:00", "DD-MM-YYYY HH:mm:ss");
Разбор выполняется строго по шаблону, включая пробелы и разделители.
Moment.js допускает два режима интерпретации: нестрогий и строгий. Строгий режим включается третьим параметром:
moment("2024-02-31", "YYYY-MM-DD", true);
В строгом режиме выполняется проверка:
Пример поведения:
moment("2024-02-31", "YYYY-MM-DD", true).isValid(); // false
moment("2024-02-31", "YYYY-MM-DD", false).isValid(); // true (но дата будет скорректирована)
Строгий режим критичен в системах, где требуется гарантия точности входных данных.
Moment.js поддерживает передачу массива форматов, что позволяет обрабатывать разные варианты входных строк:
const m = moment("15/08/2024", ["YYYY-MM-DD", "DD/MM/YYYY"]);
Алгоритм работает последовательно:
Если ни один формат не подошёл, результат становится невалидной датой.
Формат не ограничен стандартными разделителями. Любые символы, не являющиеся токенами, интерпретируются как литералы:
moment("2024|08|15", "YYYY|MM|DD");
Поддерживаются:
/, |,
:, ,)Важно, что структура строки должна полностью соответствовать формату, включая все разделители.
Токен YY преобразуется в полный год по правилу окна
(windowing):
moment("85-05-20", "YY-MM-DD"); // 1985-05-20
Это поведение важно учитывать при работе с историческими данными.
Moment.js в базовой конфигурации не интерпретирует временные зоны из строки формата. Например:
moment("2024-08-15 10:00 +0300", "YYYY-MM-DD HH:mm Z");
Значение Z может быть распознано, но поведение зависит
от подключённых расширений (например, moment-timezone). Без них смещение
может игнорироваться или приводить к локальному времени.
moment("2024/15/08", "YYYY-MM-DD").isValid(); // false
Причина — различие в порядке и разделителях.
moment("2024-08", "YYYY-MM-DD").isValid(); // может быть true или некорректный результат
Недостающие части могут подставляться автоматически.
moment("2024-13-99", "YYYY-MM-DD").isValid(); // true (исправляется автоматически)
Без строгого режима библиотека нормализует значения, что иногда приводит к неожиданным датам.
При использовании массива форматов выбор осуществляется по первому совпадению. Это может привести к неоднозначности:
moment("01-02-03", ["DD-MM-YY", "MM-DD-YY"]);
Строка может быть интерпретирована по-разному в зависимости от порядка форматов, что требует строгого контроля последовательности.
Moment.js позволяет разбирать строки, содержащие текстовые элементы:
moment("Сегодня 2024-08-15", "[Сегодня] YYYY-MM-DD");
Квадратные скобки фиксируют литеральные части, которые игнорируются при парсинге.
Поддерживаются конструкции:
При использовании названий месяцев или дней недели учитывается текущая локаль:
moment("15 août 2024", "DD MMMM YYYY");
Если локаль не соответствует языку строки, парсинг может не выполниться.
Локализация влияет на:
После выполнения разбора основным способом контроля результата выступает:
moment(input, format).isValid();
Дополнительно используются:
year(), month(), date() для
проверки компонентовformat() для визуальной валидации результатаvalueOf() для сравнения временных меток