В библиотеке Moment.js работа с временными интервалами реализована через объект длительности. Он представляет разницу между двумя моментами времени в структурированном виде: дни, часы, минуты, секунды и миллисекунды. Такой формат удобен для вычислений, но неудобен для отображения пользователю.
const duration = moment.duration(90, 'minutes');
console.log(duration.hours()); // 1
console.log(duration.minutes()); // 30
Подобное представление полезно для логики, однако для интерфейса требуется более естественная форма выражения времени, например: «2 часа назад», «через 3 дня», «несколько минут». Именно эту задачу решает гуманизация длительности.
Метод humanize() преобразует объект длительности в
человекочитаемую строку. Он учитывает масштаб интервала и возвращает
приближённое текстовое описание.
const duration = moment.duration(45, 'seconds');
console.log(duration.humanize()); // a few seconds
Ключевая особенность заключается в том, что результат не является точным числовым отображением. Библиотека делает акцент на восприятии человеком, а не на строгой математической точности.
Гуманизация длительности в Moment.js базируется на нескольких принципах:
Пример поведения:
moment.duration(44, 'minutes').humanize(); // an hour
moment.duration(59, 'seconds').humanize(); // a minute
moment.duration(23, 'hours').humanize(); // a day
Такой подход снижает когнитивную нагрузку при восприятии временных интервалов.
Метод humanize() поддерживает отображение направления
времени относительно текущего момента. Для этого используется параметр
suffix.
moment.duration(5, 'minutes').humanize(true); // in 5 minutes
moment.duration(-5, 'minutes').humanize(true); // 5 minutes ago
При использовании true библиотека добавляет предлог,
отражающий временную ориентацию:
in — для будущих интерваловago — для прошедшихЕсли параметр не указан, возвращается нейтральная форма.
Humanize-строки зависят от текущей локали Moment.js. Библиотека использует языковые пакеты для формирования корректных выражений.
moment.locale('ru');
moment.duration(1, 'minute').humanize(); // a minute (в зависимости от локали)
При использовании русской локали формируются соответствующие формы:
Локализация влияет не только на перевод слов, но и на правила склонения, что особенно важно для языков с развитой морфологией.
Moment.js использует внутренние диапазоны для определения текстового представления:
Пример поведения:
moment.duration(44, 'seconds').humanize(); // a few seconds
moment.duration(45, 'seconds').humanize(); // a minute
moment.duration(75, 'seconds').humanize(); // 2 minutes
Такое округление делает результат предсказуемым и устойчивым к мелким изменениям входных данных.
Отрицательные значения интерпретируются как прошедшее время, но без обязательного указания суффикса.
moment.duration(-3, 'days').humanize(); // 3 days
moment.duration(-3, 'days').humanize(true); // 3 days ago
Таким образом, знак влияет только на контекст, а не на базовую форму строки.
Несмотря на удобство, метод имеет ряд ограничений:
Пример пограничного поведения:
moment.duration(89, 'seconds').humanize(); // a minute
moment.duration(91, 'seconds').humanize(); // 2 minutes
Такие переходы могут быть неожиданными при строгих требованиях к отображению времени.
Гуманизация может применяться после операций над длительностями:
const duration = moment.duration(2, 'hours')
.add(30, 'minutes');
duration.humanize(); // 3 hours
Внутренние преобразования приводят к нормализации значений перед генерацией строки.
Хотя humanize() работает с длительностями, он часто
используется совместно с вычислениями разницы дат:
const now = moment();
const future = moment().add(10, 'days');
moment.duration(future.diff(now)).humanize(true); // in 10 days
В таких случаях длительность выступает промежуточным представлением между двумя моментами времени.
При увеличении длительности библиотека продолжает использовать ближайшую значимую единицу:
moment.duration(400, 'days').humanize(); // a year
moment.duration(800, 'days').humanize(); // 2 years
Это упрощает восприятие крупных временных промежутков, скрывая избыточную детализацию.
Алгоритм гуманизации опирается на:
Каждая длительность преобразуется в наиболее «естественную» единицу, после чего применяется языковой шаблон.
Гуманизированные строки используются в интерфейсах, где требуется:
Основная цель заключается в снижении необходимости интерпретации числовых значений и переводе времени в интуитивно понятный формат.