Настройка относительного времени

Moment.js предоставляет мощные возможности для работы с датами и временем, включая удобное отображение относительных значений, таких как «2 минуты назад» или «через 3 дня». Для реализации таких функций используется метод fromNow() и настройка локалей с поддержкой кастомных форматов.


Использование fromNow() для вычисления относительного времени

Метод fromNow() возвращает строку, представляющую разницу между текущей датой и моментом времени объекта Moment:

const moment = require('moment');

const futureDate = moment().add(5, 'days');
console.log(futureDate.fromNow()); // "через 5 дней"

const pastDate = moment().subtract(2, 'hours');
console.log(pastDate.fromNow()); // "2 часа назад"

Ключевые моменты:

  • Метод автоматически определяет, находится ли дата в будущем или прошлом.
  • Для отрицательных и положительных интервалов возвращается различное слово-пояснение (“назад”, “через”).

Настройка локалей

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

moment.locale('ru');

const date = moment().subtract(1, 'day');
console.log(date.fromNow()); // "вчера"

Локаль отвечает за правильное склонение числительных и падежей в строках вроде «1 день назад», «2 дня назад», «5 дней назад».

Особенности русской локали:

  • Существуют специальные правила для числительных от 1 до 4, от 5 до 20 и т.д.
  • Для единиц времени (секунда, минута, час, день, месяц, год) применяется отдельное склонение.
  • Moment.js автоматически учитывает эти правила, если установлена правильная локаль.

Настройка кастомных форматов относительного времени

Moment.js позволяет переопределять шаблоны для отображения относительного времени через объект 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() будет использовать новые шаблоны:

const date = moment().add(3, 'hours');
console.log(date.fromNow()); // "через 3 часов"

Пояснения по шаблонам:

  • %s и %d используются для вставки числового значения времени.
  • Можно изменять как формы будущего (future), так и прошедшего (past) времени.
  • Каждое значение (s, m, mm, h, hh, d, dd, M, MM, y, yy) отвечает за определённый интервал времени.

Использование from() для сравнения с произвольной датой

Метод from() позволяет вычислять относительное время не только относительно текущего момента, но и относительно любой другой даты:

const date1 = moment('2026-06-01');
const date2 = moment('2026-06-10');

console.log(date1.from(date2)); // "9 дней назад"
console.log(date2.from(date1)); // "через 9 дней"

Особенности метода from():

  • Первый аргумент — дата, относительно которой вычисляется интервал.
  • Возвращает строку с автоматическим склонением числительных и выбором формы прошедшего или будущего времени.
  • Совместим с кастомными локалями и шаблонами, заданными через updateLocale.

Переопределение единиц времени для специальных случаев

Можно создавать свои единицы времени или изменять существующие через relativeTimeThreshold:

moment.relativeTimeThreshold('s', 45); // секунд до минуты
moment.relativeTimeThreshold('m', 45); // минут до часа
moment.relativeTimeThreshold('h', 22); // часов до дня
moment.relativeTimeThreshold('d', 26); // дней до месяца
moment.relativeTimeThreshold('M', 11); // месяцев до года

Эти пороги позволяют гибко управлять тем, когда Moment.js переключается на следующую единицу времени:

const date = moment().subtract(30, 'seconds');
console.log(date.fromNow()); // "несколько секунд"

Изменение порогов позволяет, например, показывать «1 минута назад» раньше или позже, чем по умолчанию.


Форматирование с calendar()

Для некоторых интерфейсов удобнее использовать метод calendar(), который показывает относительное время с дополнительным контекстом:

const yesterday = moment().subtract(1, 'day');
console.log(yesterday.calendar()); // "Вчера в 14:23"

const tomorrow = moment().add(1, 'day');
console.log(tomorrow.calendar()); // "Завтра в 14:23"

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

  • Метод автоматически подбирает формат: «вчера», «сегодня», «завтра», либо точную дату.
  • Можно настраивать шаблоны через updateLocale для всех случаев календаря.

Резюме ключевых возможностей

  • fromNow() — отображение относительного времени от текущего момента.
  • from() — отображение относительного времени от произвольной даты.
  • Локали и updateLocale обеспечивают корректное склонение и кастомизацию шаблонов.
  • relativeTimeThreshold позволяет управлять порогами смены единиц времени.
  • calendar() дополняет функционал для более естественного отображения дат в интерфейсах.

Эти возможности делают Moment.js универсальным инструментом для работы с датами в формате человеческого восприятия, позволяя создавать локализованные и гибко настраиваемые интерфейсы.