Удаление суффиксов

Moment.js предоставляет мощные возможности для форматирования и локализации дат и времени. Одной из ключевых задач при локализации является управление суффиксами, которые добавляются к отображению временных интервалов, таких как «через 5 минут» или «5 минут назад». В библиотеке Moment.js есть встроенные методы, позволяющие как использовать, так и удалять эти суффиксы.


Определение суффиксов в Moment.js

Суффиксы используются в функциях отображения относительного времени (fromNow, from, toNow, to). По умолчанию Moment.js добавляет суффиксы в зависимости от локали:

moment.locale('ru');
moment().add(5, 'minutes').fromNow(); // "через 5 минут"
moment().subtract(5, 'minutes').fromNow(); // "5 минут назад"

Здесь через и назад — это суффиксы, которые можно отключать при необходимости.


Удаление суффиксов через параметр функции

Функции from и fromNow принимают параметр withoutSuffix, который позволяет выводить только числовое значение и единицу времени без добавления слов типа «через» или «назад».

const now = moment();
const future = moment().add(10, 'days');

console.log(future.from(now, true)); // "10 дней" без суффикса
console.log(future.fromNow(true));   // "10 дней" без суффикса
  • Параметр true указывает на игнорирование суффикса.
  • Если не указывать параметр или поставить false, Moment.js автоматически добавит суффикс в соответствии с локалью.

Применение при локализации

Удаление суффиксов особенно важно при создании гибких интерфейсов, где требуется динамическое отображение времени в различных форматах без зависимости от локали.

moment.locale('ru');

const past = moment().subtract(3, 'hours');
console.log(past.fromNow());      // "3 часа назад"
console.log(past.fromNow(true));  // "3 часа" — без суффикса

Здесь fromNow(true) используется для чистого отображения интервала, а не его относительного положения во времени.


Использование в форматировании пользовательских сообщений

Иногда необходимо формировать строки с интервалами времени, но без лишних слов. В таких случаях комбинация методов from и параметра true является идеальным решением:

function formatDuration(duration) {
    return moment.duration(duration).humanize(true); // с суффиксом
}

function formatDurationWithoutSuffix(duration) {
    return moment.duration(duration).humanize(false); // без суффикса
}

console.log(formatDuration(moment.duration(2, 'days')));       // "через 2 дня"
console.log(formatDurationWithoutSuffix(moment.duration(2, 'days'))); // "2 дня"
  • humanize(true) — возвращает строку с суффиксом.
  • humanize(false) — возвращает только числовое значение и единицу времени без добавления «через» или «назад».

Важные моменты

  1. Локаль влияет на форму слова: даже без суффикса число и единица времени могут изменяться в зависимости от падежа в выбранной локали.
  2. Функции from, fromNow, to, toNow позволяют гибко управлять отображением времени и могут комбинироваться с параметром withoutSuffix.
  3. humanize работает с объектами Duration и также принимает параметр для удаления суффикса, что позволяет использовать его для интерфейсов с динамическим отображением длительности.

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

moment.locale('ru');

const durations = [
    moment.duration(1, 'minute'),
    moment.duration(5, 'minutes'),
    moment.duration(1, 'hour'),
    moment.duration(3, 'hours'),
    moment.duration(1, 'day'),
    moment.duration(7, 'days')
];

durations.forEach(d => {
    console.log(d.humanize());       // с суффиксом
    console.log(d.humanize(false));  // без суффикса
});
  • Такой подход удобен для отображения списка интервалов в UI, где иногда требуется убрать лишние слова, чтобы строка была краткой и лаконичной.

Практическое применение

Удаление суффиксов полезно для:

  • Таблиц с временными данными.
  • Отображения временных интервалов в уведомлениях или отчётах.
  • Интерактивных графиков и таймеров, где важен только числовой интервал.

Комбинируя fromNow(true) или humanize(false), Moment.js позволяет сохранять чистоту интерфейса, избегая перегруженных формулировок с лишними словами.