Одним из ключевых способов работы с датами в Moment.js является создание объекта из текстового представления даты. Библиотека умеет распознавать множество форматов, автоматически преобразовывать строки в даты и учитывать локализацию, временные зоны и пользовательские шаблоны.
Самый простой вариант — передача строки в функцию
moment():
const date = moment('2025-03-15');
console.log(date.format());
Moment попытается самостоятельно определить формат строки и преобразовать её в объект даты.
Поддерживаются:
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 — основной рекомендуемый формат для хранения и передачи дат.
Пример:
const date = moment('2025-03-15T18:30:00');
console.log(date.format());
Преимущества ISO:
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 используется moment.utc():
const date = moment.utc(
'2025-03-15 18:30',
'YYYY-MM-DD HH:mm'
);
console.log(date.format());
Такой объект будет работать в UTC независимо от локального времени системы.
moment('2025-03-15');
Использует локальную временную зону пользователя.
moment.utc('2025-03-15');
Использует всемирное координированное время.
Метод parseZone() сохраняет timezone из строки:
const date = moment.parseZone(
'2025-03-15T18:30:00+05:00'
);
console.log(date.utcOffset());
Это полезно при работе с серверными API.
Некоторые строки могут трактоваться по-разному:
moment('03-04-2025');
Возможные варианты:
Поэтому рекомендуется:
Moment может обрабатывать только время:
const time = moment('18:45', 'HH:mm');
console.log(time.format());
Дата при этом будет взята из текущего дня.
Поддерживается 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());
const date = moment.unix(1742032800);
console.log(date.format());
const date = moment('1742032800000', 'x');
console.log(date.format());
| Токен | Описание |
|---|---|
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
);
Аргументы:
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());
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(value, format, true)
где:
value — строка;format — строгий шаблон;true — строгий режим проверки.