Moment.js предоставляет встроенные механизмы для работы с датами в формате ISO 8601, который является международным стандартом представления даты и времени. Поддержка этого формата встроена в базовый парсер и используется как один из основных сценариев обработки строковых дат.
ISO 8601 охватывает широкий спектр вариантов записи: календарные даты, дату и время с часовым поясом, сокращённые формы, недельные даты и порядковые даты. Поведение Moment.js при разборе зависит от того, как именно передана строка и какой режим парсинга используется.
При передаче строки в конструктор Moment.js библиотека пытается определить формат автоматически:
moment("2026-05-21T14:30:00Z");
Если строка соответствует ISO 8601, она распознаётся без
дополнительных указаний формата. Символ Z обозначает
UTC-время (нулевое смещение часового пояса).
Допустимые варианты:
moment("2026-05-21");
moment("2026-05-21T14:30:00");
moment("2026-05-21T14:30:00+05:00");
moment("2026-05-21T14:30:00.123Z");
Разбор происходит в «гибком» режиме: библиотека пытается интерпретировать строку даже при неполной или частично отклоняющейся структуре.
Для исключения неоднозначностей используется строгий режим парсинга:
moment("2026-05-21T14:30:00Z", moment.ISO_8601, true);
Ключевые особенности:
moment.ISO_8601 указывает формат
ISO;true включает строгий режим;Любые отклонения (лишние символы, неверный порядок, отсутствие обязательных частей) приводят к невалидной дате.
moment("2026-05-21T14:30:00Z");
Структура:
YYYY-MM-DDTHH:mm:ssZ или смещение ±HH:mmmoment("2026-05-21");
Интерпретируется как начало дня в локальном часовом поясе (или UTC при использовании специальных методов).
moment("2026-05-21T14:30:00.250Z");
Поддерживаются дробные секунды до миллисекундного уровня.
moment("2026-05-21T14:30:00+05:00");
moment("2026-05-21T09:30:00-02:00");
Смещение влияет на внутреннее хранение даты, которая нормализуется к UTC.
moment.utc("2026-05-21T14:30:00Z");
Использование utc() фиксирует интерпретацию строки как
UTC независимо от локальной зоны.
moment("2026-05-21T14:30:00Z");
Хотя строка содержит Z, при использовании обычного
конструктора возможна конвертация в локальное время при последующих
операциях отображения.
Метод parseZone сохраняет информацию о часовом поясе из
строки:
moment.parseZone("2026-05-21T14:30:00+05:00");
Особенности:
+05:00 сохраняется;Moment.js допускает сокращённые формы ISO:
moment("20260521");
или:
moment("2026-05");
Такие варианты интерпретируются как:
YYYYMMDDYYYY-MMОднако строгий ISO 8601 требует дефисов, поэтому такие формы не всегда считаются полностью стандартными.
ISO 8601 включает представление недель:
YYYY-Www-D
Пример:
moment("2026-W21-3");
Разбор:
2026 — годW21 — 21-я неделя3 — средаMoment.js поддерживает недельные даты через ISO-парсер, но поведение может зависеть от версии и требует проверки валидности:
moment("2026-W21-3", moment.ISO_8601, true).isValid();
Формат:
YYYY-DDD
где DDD — день года.
Пример:
moment("2026-141");
Интерпретация:
Внутренний алгоритм Moment.js:
Пример:
moment("2026-05-21T14:30:00Z").format();
Проверка корректности выполняется через:
moment("2026-05-21T14:30:00Z").isValid();
Важно учитывать:
moment("2026-05-21T14:30:00");
Не указано смещение → интерпретация зависит от локальной зоны выполнения кода.
moment("2026-05-21 14:30:00Z");
Пробел вместо T формально нарушает ISO 8601, но может
быть принят в гибком режиме.
moment("2026-05");
Интерпретируется как первый день месяца, что может приводить к скрытым ошибкам при сравнении дат.
Формирование строки ISO выполняется через:
moment().toISOString();
Результат всегда соответствует стандарту:
2026-05-21T14:30:00.000Z
Особенности:
ISO 8601:
2026-05-21T14:30:00Z
Unix timestamp:
moment().valueOf();
Сравнение:
Пример комбинированного использования:
moment("2026-05-21T14:30:00Z")
.utc()
.add(2, "hours")
.format("YYYY-MM-DDTHH:mm:ss[Z]");
Поведение:
const a = moment("2026-05-21T10:00:00Z");
const b = moment("2026-05-21T12:00:00Z");
a.isBefore(b);
Особенности:
ISO 8601 является одним из ключевых форматов, на которых построена логика библиотеки:
toISOString().Поддержка ISO 8601 обеспечивает совместимость с современными
JavaScript API, включая Date, HTTP-заголовки и
JSON-представления дат.