Условное форматирование в Moment.js основано на выборе способа
отображения даты или времени в зависимости от контекста: расстояния до
текущего момента, диапазона значений, локали и заранее заданных правил.
В отличие от статического format(), где строка вывода
всегда фиксирована, здесь применяется логика, изменяющая представление
данных динамически.
Основные механизмы, обеспечивающие условное форматирование в Moment.js:
fromNow, toNow)calendar)diff и условия в кодеМетод format() формирует строку даты по шаблону
токенов:
moment().format('YYYY-MM-DD HH:mm');
Этот подход не учитывает контекст. Например, одинаковый формат применяется к:
Отсутствие контекстной логики приводит к необходимости использования дополнительных инструментов Moment.js.
Методы fromNow() и toNow() формируют строку
на основе разницы между датами и текущим временем.
moment().subtract(5, 'minutes').fromNow(); // "5 минут назад"
moment().add(2, 'days').fromNow(); // "через 2 дня"
Внутренняя логика выбирает единицы измерения автоматически:
Алгоритм основан на вычислении разницы и выборе наиболее подходящего диапазона.
Moment.js позволяет изменять чувствительность отображения через
relativeTimeThreshold.
moment.relativeTimeThreshold('m', 45);
moment.relativeTimeThreshold('h', 22);
moment.relativeTimeThreshold('d', 26);
Эти параметры влияют на момент переключения между единицами измерения.
Пример влияния:
Таким образом реализуется тонкая настройка условного поведения.
Метод calendar() использует набор правил, определяющих
формат в зависимости от разницы между датами.
moment().calendar();
Стандартное поведение включает категории:
Пример результата:
Поведение можно полностью переопределить через
updateLocale.
moment.updateLocale('ru', {
calendar: {
sameDay: '[Сегодня в] LT',
nextDay: '[Завтра в] LT',
nextWeek: 'dddd [в] LT',
lastDay: '[Вчера в] LT',
lastWeek: 'DD.MM.YYYY',
sameElse: 'DD.MM.YYYY'
}
});
Каждое правило соответствует условию:
sameDay — текущий деньnextDay — следующий деньnextWeek — ближайшая неделяlastDay — вчераlastWeek — прошлая неделяsameElse — все остальные случаиФактически это декларативная система условного форматирования.
Метод diff() возвращает разницу между датами в заданных
единицах измерения.
const a = moment('2026-05-21');
const b = moment('2026-05-18');
a.diff(b, 'days'); // 3
На основе результата формируются условия отображения:
const date = moment('2026-05-21');
const now = moment();
if (date.diff(now, 'days') === 0) {
date.format('[Сегодня]');
} else if (date.diff(now, 'days') === -1) {
date.format('[Вчера]');
} else {
date.format('YYYY-MM-DD');
}
Такой подход позволяет реализовать полностью кастомную логику, выходящую за рамки встроенных методов Moment.js.
Условное форматирование часто реализуется через комбинирование
format() и логических проверок.
const date = moment('2026-05-21');
const output =
date.isSame(moment(), 'day')
? date.format('[Сегодня в] HH:mm')
: date.isBefore(moment(), 'day')
? date.format('[Прошедшая дата:] DD.MM.YYYY')
: date.format('DD.MM.YYYY');
Используются методы сравнения:
isSameisBeforeisAfterisBetweenMoment.js поддерживает локали, которые влияют на правила вывода текста, месяцев, дней недели и относительных выражений.
moment.locale('ru');
moment().fromNow();
Каждая локаль содержит:
Это означает, что один и тот же код может формировать разные строки в зависимости от активной локали.
Локаль также содержит настройки relativeTime,
определяющие строки для каждого диапазона.
moment.updateLocale('ru', {
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минуту',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
}
});
Эта система формирует основу условного вывода в
fromNow().
В реальных сценариях часто применяется комбинированный подход:
calendar() для ближайших датfromNow() для событий в прошлом и будущемformat() для исторических записейconst date = moment('2026-05-20');
const now = moment();
let output;
if (date.diff(now, 'days') === 0) {
output = date.calendar();
} else if (Math.abs(date.diff(now, 'days')) < 7) {
output = date.fromNow();
} else {
output = date.format('DD.MM.YYYY');
}
Такая схема позволяет разделять временные интервалы на смысловые категории.
Некорректные даты требуют отдельной обработки.
const date = moment('invalid-date');
if (!date.isValid()) {
date.format('[Некорректная дата]');
}
Метод isValid() предотвращает распространение ошибок в
форматировании и позволяет подставлять резервные значения.
Moment Duration используется для анализа временных промежутков.
const duration = moment.duration(90, 'minutes');
if (duration.asMinutes() < 60) {
// минуты
} else if (duration.asHours() < 24) {
// часы
} else {
// дни
}
Методы:
asSecondsasMinutesasHoursasDaysдают числовую основу для условной логики.
Moment.js автоматически изменяет представление при переходе через пороги:
Эти переходы зависят от внутренней логики округления и настроек локали.
В крупных приложениях применяется централизованная функция форматирования:
function formatDate(date) {
const m = moment(date);
const now = moment();
if (m.isSame(now, 'minute')) return m.format('[Сейчас]');
if (m.isSame(now, 'day')) return m.calendar();
if (m.isSame(now, 'year')) return m.format('DD MMM');
return m.format('DD.MM.YYYY');
}
Такой подход формирует многоуровневую систему условного представления данных.
При разработке логики отображения учитываются приоритеты:
Эта иерархия обеспечивает предсказуемость результата при разных входных данных.