Парсинг специальных форматов ISO 8601

Moment.js предоставляет встроенные механизмы для работы с датами в формате ISO 8601, который является международным стандартом представления даты и времени. Поддержка этого формата встроена в базовый парсер и используется как один из основных сценариев обработки строковых дат.

ISO 8601 охватывает широкий спектр вариантов записи: календарные даты, дату и время с часовым поясом, сокращённые формы, недельные даты и порядковые даты. Поведение Moment.js при разборе зависит от того, как именно передана строка и какой режим парсинга используется.


Автоматический разбор ISO 8601 строк

При передаче строки в конструктор 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");

Разбор происходит в «гибком» режиме: библиотека пытается интерпретировать строку даже при неполной или частично отклоняющейся структуре.


Строгий разбор ISO 8601

Для исключения неоднозначностей используется строгий режим парсинга:

moment("2026-05-21T14:30:00Z", moment.ISO_8601, true);

Ключевые особенности:

  • второй аргумент moment.ISO_8601 указывает формат ISO;
  • третий аргумент true включает строгий режим;
  • строка должна полностью соответствовать стандарту.

Любые отклонения (лишние символы, неверный порядок, отсутствие обязательных частей) приводят к невалидной дате.


Форматы ISO 8601, поддерживаемые Moment.js

Полная дата и время

moment("2026-05-21T14:30:00Z");

Структура:

  • дата YYYY-MM-DD
  • разделитель T
  • время HH:mm:ss
  • зона Z или смещение ±HH:mm

Дата без времени

moment("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.


Разбор ISO 8601 с UTC и локальным временем

UTC-время

moment.utc("2026-05-21T14:30:00Z");

Использование utc() фиксирует интерпретацию строки как UTC независимо от локальной зоны.


Локальная интерпретация

moment("2026-05-21T14:30:00Z");

Хотя строка содержит Z, при использовании обычного конструктора возможна конвертация в локальное время при последующих операциях отображения.


parseZone и сохранение исходного смещения

Метод parseZone сохраняет информацию о часовом поясе из строки:

moment.parseZone("2026-05-21T14:30:00+05:00");

Особенности:

  • смещение +05:00 сохраняется;
  • при форматировании оно учитывается;
  • дата не приводится к локальному часовому поясу автоматически.

ISO 8601 и неявные форматы

Moment.js допускает сокращённые формы ISO:

moment("20260521");

или:

moment("2026-05");

Такие варианты интерпретируются как:

  • YYYYMMDD
  • YYYY-MM

Однако строгий ISO 8601 требует дефисов, поэтому такие формы не всегда считаются полностью стандартными.


Недельные даты 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();

Порядковые даты ISO 8601

Формат:

YYYY-DDD

где DDD — день года.

Пример:

moment("2026-141");

Интерпретация:

  • 141-й день 2026 года

Автоматическое определение ISO-формата

Внутренний алгоритм Moment.js:

  1. проверяет строку на соответствие ISO 8601;
  2. если совпадение найдено — использует специализированный парсер;
  3. иначе переходит к fallback-логике (Date.parse или кастомные форматы).

Пример:

moment("2026-05-21T14:30:00Z").format();

Валидность после парсинга ISO 8601

Проверка корректности выполняется через:

moment("2026-05-21T14:30:00Z").isValid();

Важно учитывать:

  • строка может быть распознана, но интерпретирована с корректировкой;
  • некорректные значения могут быть «исправлены» библиотекой;
  • строгий режим предотвращает автоматическую коррекцию.

Проблемы неоднозначности ISO 8601

Отсутствие временной зоны

moment("2026-05-21T14:30:00");

Не указано смещение → интерпретация зависит от локальной зоны выполнения кода.


Смешение форматов

moment("2026-05-21 14:30:00Z");

Пробел вместо T формально нарушает ISO 8601, но может быть принят в гибком режиме.


Частично заполненные строки

moment("2026-05");

Интерпретируется как первый день месяца, что может приводить к скрытым ошибкам при сравнении дат.


Использование ISO 8601 в сериализации

Формирование строки ISO выполняется через:

moment().toISOString();

Результат всегда соответствует стандарту:

2026-05-21T14:30:00.000Z

Особенности:

  • всегда UTC;
  • всегда полный формат;
  • миллисекунды присутствуют даже при нулевом значении.

Разница между ISO 8601 и Unix timestamp

ISO 8601:

2026-05-21T14:30:00Z

Unix timestamp:

moment().valueOf();

Сравнение:

  • ISO 8601 — человекочитаемый формат;
  • timestamp — числовое представление в миллисекундах;
  • Moment.js свободно конвертирует между ними.

Парсинг ISO 8601 в цепочках преобразований

Пример комбинированного использования:

moment("2026-05-21T14:30:00Z")
  .utc()
  .add(2, "hours")
  .format("YYYY-MM-DDTHH:mm:ss[Z]");

Поведение:

  • исходная дата распознана как ISO;
  • переведена в UTC;
  • выполнена арифметика времени;
  • результат снова приведён к ISO-формату.

ISO 8601 и сравнение дат

const a = moment("2026-05-21T10:00:00Z");
const b = moment("2026-05-21T12:00:00Z");

a.isBefore(b);

Особенности:

  • сравнение происходит на уровне UTC;
  • формат ISO не влияет на результат после парсинга;
  • различия важны только на этапе интерпретации строки.

Роль ISO 8601 как базового формата Moment.js

ISO 8601 является одним из ключевых форматов, на которых построена логика библиотеки:

  • используется как основной стандарт обмена данными;
  • применяется в API и внешних системах;
  • поддерживается без необходимости явного указания формата;
  • служит основой для сериализации через toISOString().

Поддержка ISO 8601 обеспечивает совместимость с современными JavaScript API, включая Date, HTTP-заголовки и JSON-представления дат.