Система единиц измерения в Day.js основана на строковых идентификаторах временных интервалов, которые интерпретируются строго и унифицированно во всех методах работы с датами. Каждая единица представляет собой фиксированный смысловой интервал времени, используемый для арифметики дат, вычислений разницы и нормализации временных значений.
Day.js поддерживает стандартный набор единиц, применяемых в большинстве API:
ms)s)m)h)d)w)M)Q)y)Единицы передаются в виде строковых литералов и чувствительны к
точному написанию. Использование сокращений допустимо в ограниченном
числе случаев (например, h, m,
s), однако полные формы обеспечивают более предсказуемое
поведение при чтении и поддержке кода.
Внутренний парсер Day.js приводит входные значения к заранее определённому набору идентификаторов. Любые отклонения от стандарта игнорируются или приводят к некорректным вычислениям.
Примеры корректных значений:
dayjs().add(1, 'day')
dayjs().add(2, 'month')
dayjs().add(15, 'minute')
Некорректные формы:
dayjs().add(1, 'days') // не гарантируется поддержка множественного числа
dayjs().add(1, 'Day') // регистр имеет значение
dayjs().add(1, 'minutes ') // пробелы ломают интерпретацию
Единицы должны использоваться в строго нормализованной форме, поскольку Day.js не выполняет семантическое исправление входных строк.
Метод add изменяет дату, увеличивая её на заданный
интервал:
dayjs('2024-01-01').add(10, 'day')
dayjs('2024-01-01').add(3, 'month')
dayjs('2024-01-01').add(1, 'year')
Поведение зависит от типа единицы:
Метод subtract является симметричным add и
использует те же единицы:
dayjs('2024-01-10').subtract(5, 'day')
dayjs('2024-06-01').subtract(2, 'month')
Логика обработки единиц полностью идентична добавлению, за исключением направления смещения.
Месяцы не имеют фиксированной длины. При операциях:
dayjs('2024-01-31').add(1, 'month')
результат зависит от контекста календаря. Если целевая дата не существует (например, 31 февраля), Day.js нормализует её до последнего дня месяца.
Годовая арифметика аналогична месячной, но с более выраженным влиянием високосных лет:
dayjs('2020-02-29').add(1, 'year')
Результат корректируется в соответствии с отсутствием 29 февраля в невисокосных годах.
Метод diff использует единицы измерения для определения
точности результата:
dayjs('2024-01-10').diff('2024-01-01', 'day')
dayjs('2024-01-10').diff('2024-01-01', 'hour')
dayjs('2024-01-10').diff('2024-01-01', 'month')
Особенности:
Методы startOf и endOf используют те же
единицы для нормализации даты:
dayjs().startOf('day')
dayjs().endOf('month')
dayjs().startOf('year')
Поведение по единицам:
day — сброс времени до 00:00:00.000;month — переход к первому дню месяца;year — переход к 1 января;hour, minute, second —
последовательная обрезка точности.Квартал используется для бизнес-логики:
dayjs().add(1, 'quarter')
Квартал интерпретируется как 3 месяца, но при вычислениях учитывается календарная структура года.
Неделя зависит от локали и настроек начала недели:
dayjs().add(1, 'week')
dayjs().startOf('week')
В разных локалях неделя может начинаться с понедельника или
воскресенья, что влияет на результат startOf и
endOf.
Плагин duration расширяет модель времени, вводя
абстракцию длительности:
dayjs.duration(5000, 'millisecond')
dayjs.duration(2, 'hour')
dayjs.duration(1, 'day')
Единицы в duration совпадают с базовыми, но
интерпретация отличается:
Пример нормализации:
const d = dayjs.duration(90, 'minute')
d.asHours() // 1.5
Day.js не выполняет автоматическую коррекцию строковых значений единиц. Это означает:
Корректная стратегия работы заключается в централизованном хранении единиц:
const TIME_UNITS = {
DAY: 'day',
MONTH: 'month',
YEAR: 'year',
HOUR: 'hour',
MINUTE: 'minute',
SECOND: 'second'
}
При передаче неизвестной строки:
dayjs().add(1, 'dayss')
поведение становится непредсказуемым: значение может быть проигнорировано или интерпретировано как миллисекунды в зависимости от контекста внутреннего парсера. Это приводит к необходимости строгой валидации входных данных до вызова API Day.js.
Некоторые операции интерпретируют единицы по-разному:
add/subtract — абсолютное смещение даты;diff — измерение расстояния между моментами
времени;startOf/endOf — приведение к границе временного
интервала;duration — независимая модель времени.Это различие определяет семантику одной и той же единицы в разных вычислительных сценариях.