Настройка порогов

В контексте работы с датами в Day.js под «порогами» обычно понимаются границы переключения между единицами времени при форматировании относительных значений: секунды, минуты, часы, дни, месяцы и годы. Эти границы определяют, в какой момент библиотека перестаёт говорить «несколько секунд назад» и начинает использовать «минуту назад», «час назад» и так далее.

Механизм порогов напрямую связан с плагином relativeTime, который отвечает за преобразование разницы дат в человекочитаемые строки. В отличие от более монолитных решений, Day.js не использует жёстко зашитые числовые пороги в виде отдельных публичных API-функций. Вместо этого применяется комбинация локалей и правил форматирования.


Структура относительных значений

Плагин относительного времени оперирует набором ключей, каждый из которых соответствует диапазону времени:

  • s — секунды (меньше минуты)
  • m — одна минута
  • mm — несколько минут
  • h — час
  • hh — несколько часов
  • d — день
  • dd — несколько дней
  • M — месяц
  • MM — несколько месяцев
  • y — год
  • yy — несколько лет

Каждый ключ задаёт строковое правило, а выбор ключа зависит от внутреннего расчёта разницы между датами.


Логика переключения между единицами

Пороговое поведение в Day.js определяется не явными числовыми границами, а функцией выбора формата:

  1. Вычисляется разница между датами.
  2. Разница нормализуется в базовые единицы (секунды).
  3. На основе диапазонов выбирается соответствующий ключ локали.

Фактически пороги «распределены» внутри логики плагина и выражаются через условия:

  • менее 45 секунд → секунды (s)
  • менее 90 секунд → минута (m)
  • менее 45 минут → минуты (mm)
  • менее 90 минут → час (h)
  • менее 22 часов → часы (hh)
  • менее 26 дней → дни (d)
  • менее 45 дней → месяцы (M)
  • менее 320 дней → месяцы (MM)
  • далее — годы (y, yy)

Эта схема характерна для стандартной конфигурации и может отличаться в зависимости от локали или пользовательских переопределений.


Настройка через локализацию

Основной способ изменения поведения порогов — переопределение локали через updateLocale.

При подключении плагина relativeTime структура локали включает объект relativeTime, в котором задаются шаблоны строк:

  • future
  • past
  • s
  • m
  • mm
  • h
  • hh
  • d
  • dd
  • M
  • MM
  • y
  • yy

Пример изменения логики отображения минут и часов заключается не в изменении числовых границ напрямую, а в изменении строковых правил:

import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import updateLocale from 'dayjs/plugin/updateLocale'

dayjs.extend(relativeTime)
dayjs.extend(updateLocale)

dayjs.updateLocale('en', {
  relativeTime: {
    future: 'in %s',
    past: '%s ago',
    s: 'a few seconds',
    m: 'one minute',
    mm: '%d minutes',
    h: 'an hour',
    hh: '%d hours',
    d: 'a day',
    dd: '%d days',
    M: 'a month',
    MM: '%d months',
    y: 'a year',
    yy: '%d years'
  }
})

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


Косвенное управление порогами

Поскольку Day.js не предоставляет прямого API для изменения числовых границ переключения единиц, применяется несколько подходов:

1. Переопределение relativeTime логики

Можно изменить поведение через кастомные функции форматирования, заменяя стандартный вывод:

dayjs.extend((option, Dayjs, dayjsInstance) => {
  const oldFrom = dayjsInstance.prototype.from

  dayjsInstance.prototype.from = function (input, withoutSuffix) {
    const diff = this.diff(input)

    if (diff < 60000) {
      return 'менее минуты назад'
    }

    return oldFrom.bind(this)(input, withoutSuffix)
  }
})

Такой подход позволяет внедрить собственные пороговые условия, полностью обходя стандартный механизм.


2. Использование промежуточной нормализации времени

Часто пороги реализуются вне Day.js:

function customFromNow(date) {
  const now = dayjs()
  const diffSeconds = now.diff(date, 'second')

  if (diffSeconds < 30) return 'только что'
  if (diffSeconds < 90) return 'меньше минуты'
  if (diffSeconds < 3600) return `${Math.floor(diffSeconds / 60)} минут назад`

  return dayjs(date).fromNow()
}

В этом случае Day.js используется только как базовый вычислитель дат, а пороговая логика переносится в прикладной слой.


Роль плагина relativeTime в формировании порогов

Плагин relativeTime является центральным механизмом, отвечающим за:

  • вычисление разницы между датами
  • выбор единицы измерения
  • форматирование строки

Внутри него реализована цепочка условий, определяющая переход между уровнями детализации времени. Именно эта цепочка воспринимается как «пороговая система».


Поведение в различных локалях

Локали могут влиять не только на текст, но и на интерпретацию границ:

  • различия в правилах множественного числа
  • особенности округления
  • различная интерпретация «нескольких» единиц времени

Некоторые локали делают переход к следующей единице времени более агрессивным, сокращая диапазон использования секунд или минут.


Влияние округления на пороговое поведение

Ключевой фактор формирования порогов — округление разницы:

  • Math.floor используется для подавления дробных значений
  • переходы между единицами происходят при достижении целых значений
  • итоговый результат зависит от выбранной единицы измерения в diff()
dayjs().diff(otherDate, 'minute')

Выбор единицы напрямую влияет на «грубость» порогов: чем крупнее единица, тем раньше происходит переход к следующему диапазону.


Комбинация плагинов и расширение пороговой модели

При подключении дополнительных плагинов поведение относительного времени может косвенно изменяться:

  • utc — влияет на базу вычислений
  • timezone — смещает точки перехода
  • duration — позволяет строить альтернативные модели интервалов

В сложных системах пороговая логика часто становится композицией нескольких слоёв, где Day.js выступает только как вычислительное ядро.


Практическая модель кастомных порогов

Типичная архитектура кастомной системы порогов строится так:

  1. Day.js вычисляет разницу дат.
  2. Внешний слой определяет диапазон.
  3. Выбирается правило форматирования.
  4. Генерируется строка результата.

Такая модель позволяет полностью заменить стандартную систему relativeTime без модификации ядра библиотеки.


Особенности производственного применения

В реальных приложениях пороговая настройка используется для:

  • новостных лент (быстрая деградация времени до «часов»)
  • чатов (агрессивные пороги «только что» / «минуту назад»)
  • логов (расширенные диапазоны до дней и недель)
  • аналитики (упрощённые интервалы без секундной детализации)

Каждый сценарий требует собственной конфигурации порогов, которая чаще реализуется через внешние функции поверх Day.js, а не через модификацию локалей.