В контексте работы с датами в Day.js под «порогами» обычно понимаются границы переключения между единицами времени при форматировании относительных значений: секунды, минуты, часы, дни, месяцы и годы. Эти границы определяют, в какой момент библиотека перестаёт говорить «несколько секунд назад» и начинает использовать «минуту назад», «час назад» и так далее.
Механизм порогов напрямую связан с плагином relativeTime, который отвечает за преобразование разницы дат в человекочитаемые строки. В отличие от более монолитных решений, Day.js не использует жёстко зашитые числовые пороги в виде отдельных публичных API-функций. Вместо этого применяется комбинация локалей и правил форматирования.
Плагин относительного времени оперирует набором ключей, каждый из которых соответствует диапазону времени:
s — секунды (меньше минуты)m — одна минутаmm — несколько минутh — часhh — несколько часовd — деньdd — несколько днейM — месяцMM — несколько месяцевy — годyy — несколько летКаждый ключ задаёт строковое правило, а выбор ключа зависит от внутреннего расчёта разницы между датами.
Пороговое поведение в Day.js определяется не явными числовыми границами, а функцией выбора формата:
Фактически пороги «распределены» внутри логики плагина и выражаются через условия:
s)m)mm)h)hh)d)M)MM)y, yy)Эта схема характерна для стандартной конфигурации и может отличаться в зависимости от локали или пользовательских переопределений.
Основной способ изменения поведения порогов — переопределение локали
через updateLocale.
При подключении плагина relativeTime структура локали
включает объект relativeTime, в котором задаются шаблоны
строк:
Пример изменения логики отображения минут и часов заключается не в изменении числовых границ напрямую, а в изменении строковых правил:
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 для изменения числовых границ переключения единиц, применяется несколько подходов:
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)
}
})
Такой подход позволяет внедрить собственные пороговые условия, полностью обходя стандартный механизм.
Часто пороги реализуются вне 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 является центральным механизмом,
отвечающим за:
Внутри него реализована цепочка условий, определяющая переход между уровнями детализации времени. Именно эта цепочка воспринимается как «пороговая система».
Локали могут влиять не только на текст, но и на интерпретацию границ:
Некоторые локали делают переход к следующей единице времени более агрессивным, сокращая диапазон использования секунд или минут.
Ключевой фактор формирования порогов — округление разницы:
Math.floor используется для подавления дробных
значенийdiff()dayjs().diff(otherDate, 'minute')
Выбор единицы напрямую влияет на «грубость» порогов: чем крупнее единица, тем раньше происходит переход к следующему диапазону.
При подключении дополнительных плагинов поведение относительного времени может косвенно изменяться:
utc — влияет на базу вычисленийtimezone — смещает точки переходаduration — позволяет строить альтернативные модели
интерваловВ сложных системах пороговая логика часто становится композицией нескольких слоёв, где Day.js выступает только как вычислительное ядро.
Типичная архитектура кастомной системы порогов строится так:
Такая модель позволяет полностью заменить стандартную систему relativeTime без модификации ядра библиотеки.
В реальных приложениях пороговая настройка используется для:
Каждый сценарий требует собственной конфигурации порогов, которая чаще реализуется через внешние функции поверх Day.js, а не через модификацию локалей.