Создание из строки

Одним из ключевых способов работы с датами в Moment.js является создание объекта из текстового представления даты. Библиотека умеет распознавать множество форматов, автоматически преобразовывать строки в даты и учитывать локализацию, временные зоны и пользовательские шаблоны.


Базовое создание из строки

Самый простой вариант — передача строки в функцию moment():

const date = moment('2025-03-15');

console.log(date.format());

Moment попытается самостоятельно определить формат строки и преобразовать её в объект даты.

Поддерживаются:

  • ISO 8601
  • RFC 2822
  • некоторые браузерные форматы дат
  • пользовательские шаблоны

Автоматическое распознавание формата

Moment умеет автоматически определять популярные форматы:

moment('2025-05-10');
moment('2025-05-10T14:30:00');
moment('Fri, 10 May 2025 12:00:00 GMT');

Однако автоматическое определение имеет недостатки:

  • разные браузеры могут интерпретировать строки по-разному;
  • неоднозначные даты могут быть распознаны неверно;
  • производительность снижается при сложном анализе строки.

Поэтому для надёжной работы рекомендуется явно указывать формат.


Создание с указанием формата

Формат задаётся вторым аргументом:

const date = moment('15.03.2025', 'DD.MM.YYYY');

console.log(date.format('YYYY-MM-DD'));

В этом случае Moment строго использует указанный шаблон.


Основные токены форматов

День

Токен Описание Пример
D День месяца 5
DD День с нулём 05

Месяц

Токен Описание Пример
M Номер месяца 3
MM Месяц с нулём 03
MMM Короткое имя месяца Mar
MMMM Полное имя месяца March

Год

Токен Описание Пример
YY Двузначный год 25
YYYY Полный год 2025

Время

Токен Описание Пример
H Часы 9
HH Часы с нулём 09
m Минуты 4
mm Минуты с нулём 04
s Секунды 7
ss Секунды с нулём 07

Разбор даты и времени

Moment может одновременно обрабатывать дату и время:

const date = moment(
  '15.03.2025 18:45:20',
  'DD.MM.YYYY HH:mm:ss'
);

console.log(date.format());

Работа с локализованными строками

Moment поддерживает локали для распознавания названий месяцев и дней недели.

moment.locale('ru');

const date = moment(
  '15 март 2025',
  'DD MMMM YYYY'
);

console.log(date.format('YYYY-MM-DD'));

Строгий режим парсинга

Третий аргумент включает строгую проверку формата:

const date = moment(
  '15.03.2025',
  'DD.MM.YYYY',
  true
);

В строгом режиме:

  • формат должен совпадать полностью;
  • запрещаются лишние символы;
  • учитывается длина значений.

Пример ошибки

moment('15-03-2025', 'DD.MM.YYYY', true).isValid();

Результат:

false

Проверка корректности даты

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

const date = moment('32.01.2025', 'DD.MM.YYYY');

console.log(date.isValid());

Результат:

false

Moment обнаруживает:

  • несуществующие дни;
  • неверные месяцы;
  • ошибки времени;
  • некорректные форматы.

Создание из массива форматов

Иногда входящая строка может иметь несколько вариантов формата.

const date = moment(
  '15-03-2025',
  ['DD.MM.YYYY', 'DD-MM-YYYY']
);

console.log(date.format());

Moment проверяет форматы последовательно.


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

ISO 8601 — основной рекомендуемый формат для хранения и передачи дат.

Пример:

const date = moment('2025-03-15T18:30:00');

console.log(date.format());

Преимущества ISO:

  • международный стандарт;
  • отсутствие неоднозначности;
  • хорошая совместимость;
  • корректная работа с часовыми поясами.

Создание из RFC 2822

Moment умеет распознавать строки email-формата:

const date = moment(
  'Fri, 15 Mar 2025 18:30:00 +0300'
);

console.log(date.format());

Работа с часовыми поясами

Строка может содержать timezone offset:

const date = moment(
  '2025-03-15T18:30:00+05:00'
);

console.log(date.format());

Moment автоматически учитывает смещение.


Парсинг UTC-времени

Для создания даты в UTC используется moment.utc():

const date = moment.utc(
  '2025-03-15 18:30',
  'YYYY-MM-DD HH:mm'
);

console.log(date.format());

Такой объект будет работать в UTC независимо от локального времени системы.


Разница между local и utc

Local

moment('2025-03-15');

Использует локальную временную зону пользователя.

UTC

moment.utc('2025-03-15');

Использует всемирное координированное время.


Использование parseZone

Метод parseZone() сохраняет timezone из строки:

const date = moment.parseZone(
  '2025-03-15T18:30:00+05:00'
);

console.log(date.utcOffset());

Это полезно при работе с серверными API.


Неоднозначные даты

Некоторые строки могут трактоваться по-разному:

moment('03-04-2025');

Возможные варианты:

  • 3 апреля;
  • 4 марта.

Поэтому рекомендуется:

  • всегда указывать формат;
  • использовать ISO 8601;
  • избегать неоднозначных сокращений.

Создание из строк времени

Moment может обрабатывать только время:

const time = moment('18:45', 'HH:mm');

console.log(time.format());

Дата при этом будет взята из текущего дня.


Парсинг с AM/PM

Поддерживается 12-часовой формат:

const date = moment(
  '03:30 PM',
  'hh:mm A'
);

console.log(date.format('HH:mm'));

Токены

Токен Описание
h Часы 1–12
hh Часы с нулём
A AM/PM
a am/pm

Игнорирование лишних символов

Moment способен извлекать дату даже из сложной строки:

const date = moment(
  'Дата: 15.03.2025',
  '[Дата:] DD.MM.YYYY'
);

Текст в квадратных скобках считается литералом.


Парсинг миллисекунд

const date = moment(
  '15.03.2025 10:20:30.456',
  'DD.MM.YYYY HH:mm:ss.SSS'
);

console.log(date.millisecond());

Работа с Unix timestamp в строке

Секунды

const date = moment.unix(1742032800);

console.log(date.format());

Миллисекунды

const date = moment('1742032800000', 'x');

console.log(date.format());

Форматы timestamp

Токен Описание
X Unix timestamp в секундах
x Unix timestamp в миллисекундах

Парсинг кварталов

const date = moment('2025-Q2', 'YYYY-[Q]Q');

console.log(date.format());

Парсинг дня года

const date = moment('2025-120', 'YYYY-DDD');

console.log(date.format('YYYY-MM-DD'));

DDD обозначает порядковый номер дня в году.


Создание с объектом конфигурации

Moment допускает дополнительные параметры:

const date = moment(
  '15.03.2025',
  'DD.MM.YYYY',
  'ru',
  true
);

Аргументы:

  1. строка;
  2. формат;
  3. локаль;
  4. строгий режим.

Ошибки при парсинге

Неверный месяц

moment('15.15.2025', 'DD.MM.YYYY').isValid();

Неверный день

moment('35.03.2025', 'DD.MM.YYYY').isValid();

Неверное время

moment('25:61', 'HH:mm').isValid();

Производительность парсинга

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

moment('2025-03-15');

Быстрее работает явное указание шаблона:

moment('15.03.2025', 'DD.MM.YYYY');

Причина в том, что Moment не тратит ресурсы на попытки распознавания структуры строки.


Практический пример обработки пользовательского ввода

function parseDate(value) {
  const formats = [
    'DD.MM.YYYY',
    'DD-MM-YYYY',
    'YYYY-MM-DD'
  ];

  const date = moment(value, formats, true);

  if (!date.isValid()) {
    throw new Error('Некорректная дата');
  }

  return date;
}

const result = parseDate('15.03.2025');

console.log(result.format());

Рекомендации по использованию

Предпочтительные практики

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

Нежелательные практики

moment('03/04/25');

Подобные записи могут интерпретироваться по-разному в зависимости от окружения и локали.


Часто используемые шаблоны

Формат Шаблон
15.03.2025 DD.MM.YYYY
2025-03-15 YYYY-MM-DD
15/03/2025 18:30 DD/MM/YYYY HH:mm
03:45 PM hh:mm A
2025-03-15T18:30:00 YYYY-MM-DDTHH:mm:ss

Особенности Moment.js

При создании даты из строки важно учитывать внутренние особенности библиотеки:

  • Moment.js является mutable-библиотекой;
  • объект даты может изменяться после создания;
  • локаль влияет на распознавание текста;
  • timezone может автоматически преобразовываться;
  • браузерное окружение способно влиять на автоматический парсинг.

Из-за этого наиболее надёжным подходом считается комбинация:

moment(value, format, true)

где:

  • value — строка;
  • format — строгий шаблон;
  • true — строгий режим проверки.