Работа с датами в Day.js основана на компактной системе обозначений
временных единиц. Эти сокращения используются во множестве методов
библиотеки: add, subtract, diff,
startOf, endOf, а также в плагинах,
расширяющих функциональность ядра. Понимание системы единиц является
ключевым элементом корректной работы с временными интервалами и
вычислениями.
В Day.js каждая временная единица представляется строковым сокращением. Эти сокращения унифицированы и применяются во всех API, где требуется указание интервала.
| Полная единица | Сокращение | Описание |
|---|---|---|
| year | y |
Год |
| month | M |
Месяц |
| week | w |
Неделя |
| day | d |
День |
| hour | h |
Час |
| minute | m |
Минута |
| second | s |
Секунда |
| millisecond | ms |
Миллисекунда |
Особенность системы заключается в том, что регистр символов имеет
значение. Например, M (месяц) и m (минута)
обозначают разные сущности.
Сокращения единиц применяются как второй аргумент в методах изменения даты.
import dayjs from 'dayjs';
dayjs().add(1, 'day');
dayjs().add(2, 'month');
dayjs().add(10, 'minute');
Каждое значение интерпретируется строго по переданному сокращению. При этом Day.js не выполняет автоматическую нормализацию смыслов: единица всегда соответствует указанному типу.
dayjs().subtract(1, 'year');
dayjs().subtract(30, 'second');
dayjs().subtract(5, 'week');
Метод subtract использует тот же набор сокращений, что и
add, что обеспечивает симметрию API.
Метод diff позволяет вычислять разницу между датами в
заданных единицах.
const a = dayjs('2025-01-01');
const b = dayjs('2026-01-01');
b.diff(a, 'year'); // 1
b.diff(a, 'month'); // 12
b.diff(a, 'day'); // 365 (или 366 в високосный год)
При использовании diff важно учитывать характер
единицы:
y, M) могут включать
усеченияd, h, ms)
дают более точный результатМетоды startOf и endOf используют те же
сокращения для установки временной границы.
dayjs().startOf('year');
dayjs().startOf('month');
dayjs().endOf('day');
Поведение зависит от единицы:
year → начало/конец годаmonth → первый/последний день месяцаday → 00:00:00.000 или 23:59:59.999hour → начало/конец часаM) и минуты
(m)Наиболее частая ошибка связана с конфликтом регистров:
M — месяцm — минутаdayjs().add(1, 'M'); // +1 месяц
dayjs().add(1, 'm'); // +1 минута
Эта разница критична при динамическом формировании параметров.
w)Неделя является производной единицей и зависит от локали и настроек начала недели.
dayjs().add(2, 'w');
dayjs().startOf('w');
Неделя не всегда строго равна 7 дням в контексте календарных вычислений, особенно при работе с границами месяцев и лет.
ms)Миллисекунды представляют базовый уровень точности.
dayjs().add(500, 'ms');
dayjs().diff(otherDate, 'ms');
Используются преимущественно в высокоточных измерениях и таймерах.
Сокращения единиц используются не только в арифметических операциях, но и во всей экосистеме Day.js:
add(value, unit)subtract(value, unit)diff(date, unit)startOf(unit)endOf(unit)Дополнительные плагины также используют единицы:
dayjs.duration(2, 'hour');
dayjs.duration(90, 'minute');
Day.js обрабатывает строки единиц через внутренний словарь соответствий. Каждое сокращение сопоставляется с обработчиком, который определяет:
Календарные единицы (year, month) зависят
от структуры календаря, тогда как абсолютные (ms,
s, m, h) опираются на
фиксированные интервалы времени.
const startOfWeek = dayjs().startOf('week');
const startOfMonth = dayjs().startOf('month');
const now = dayjs();
const windowStart = now.subtract(15, 'minute');
const windowEnd = now.add(15, 'minute');
const expiresAt = dayjs().add(30, 'day');
Комбинирование единиц требует понимания иерархии времени:
year > month > week
> day > hour > minute
> second > millisecondПри преобразованиях более крупные единицы автоматически пересчитываются в меньшие, однако обратное преобразование может приводить к потере точности.
dayjs().add(1, 'month').diff(dayjs(), 'day');
Результат зависит от длины месяца, что делает операции с
M контекстно-зависимыми.
Некоторые единицы обладают семантическими ограничениями:
week может варьироваться в зависимости от локалиmonth имеет переменную длину (28–31 день)year зависит от високосных правилАбсолютные единицы (ms, s, m,
h) не имеют подобных неоднозначностей и используются для
точных вычислений.
Сокращения единиц сохраняют консистентность при цепочечных вызовах:
dayjs()
.add(2, 'day')
.subtract(3, 'hour')
.add(15, 'minute')
.startOf('day');
Каждый шаг независимо интерпретирует единицу, не влияя на предыдущие операции.
dayjs().add(1, 'm'); // минута, а не месяц
dayjs().add('1', 'day'); // допустимо, но теряет строгость типизации
dayjs().add(1, 'w'); // зависит от календарной локали
Система сокращений в Day.js строится на принципе минимализма: каждая единица представлена одним токеном, без перегруженной семантики. Это обеспечивает:
Сокращения единиц формируют базовый язык взаимодействия с временной моделью библиотеки, объединяя арифметику дат, вычисления интервалов и календарную логику в единую систему обозначений.