Работа с часами, минутами и секундами

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

Часы

Метод hour() используется для получения и установки значения часов в 24-часовом формате.

dayjs().hour()

Возвращает текущее значение часов (от 0 до 23).

При передаче аргумента метод превращается в сеттер:

dayjs().hour(14)

Особенности поведения:

  • используется 24-часовая система
  • допустимый диапазон: 0–23
  • значение автоматически нормализуется при выходе за границы
dayjs().hour(25) // интерпретируется как 1 следующего дня

Минуты

Метод minute() работает аналогично и отвечает за минуты текущего времени.

dayjs().minute()

Установка значения:

dayjs().minute(45)

Ключевые характеристики:

  • диапазон: 0–59
  • при переполнении происходит перенос в часы
dayjs().minute(75) // +1 час и 15 минут

Секунды

Метод second() управляет секундной частью времени.

dayjs().second()

Установка:

dayjs().second(30)

Поведение:

  • диапазон: 0–59
  • при выходе за пределы происходит нормализация с переносом в минуты
dayjs().second(120) // +2 минуты

Миллисекунды

Метод millisecond() позволяет работать с наименьшей единицей времени в Day.js.

dayjs().millisecond()

Установка:

dayjs().millisecond(500)

Особенности:

  • диапазон: 0–999
  • переполнение приводит к увеличению секунд
dayjs().millisecond(1500) // +1 секунда и 500 мс

Установка полного времени через цепочку методов

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

dayjs()
  .hour(10)
  .minute(30)
  .second(15)
  .millisecond(250)

Такой подход позволяет точно сформировать временную метку без использования внешних объектов Date.


Извлечение времени из существующей даты

Работа с уже существующими значениями часто требует изменения только части времени при сохранении даты.

const time = dayjs('2026-05-22T08:15:00')

time.hour(12)

В результате:

  • дата остаётся прежней
  • изменяется только компонент часа
  • создаётся новый экземпляр

Принцип неизменяемости

Каждый вызов метода изменения времени возвращает новый объект.

const t1 = dayjs()
const t2 = t1.hour(5)

t1 === t2 // false

Это свойство важно при построении предсказуемых вычислений времени:

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

Нормализация значений

Day.js автоматически корректирует выход за пределы допустимых диапазонов.

Примеры нормализации

dayjs().minute(120)

Результат:

  • +2 часа
  • минуты становятся 0
dayjs().second(3605)

Результат:

  • +1 час
  • +5 секунд

Сравнение установки и добавления времени

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

Прямое присваивание

dayjs().hour(10)
  • заменяет значение часа
  • не учитывает предыдущие значения в смысле сложения

Добавление времени

dayjs().add(2, 'hour')
  • увеличивает текущее значение
  • сохраняет относительную структуру времени

Использование add и subtract с единицами времени

Хотя работа с компонентами времени возможна через hour, minute, second, более сложные сценарии требуют использования арифметических методов.

Добавление часов

dayjs().add(3, 'hour')

Вычитание минут

dayjs().subtract(15, 'minute')

Комбинированные операции

dayjs()
  .add(1, 'hour')
  .subtract(30, 'minute')

Обнуление компонентов времени

Для установки начала временного интервала используется метод startOf().

Начало часа

dayjs().startOf('hour')

Результат:

  • минуты = 0
  • секунды = 0
  • миллисекунды = 0

Начало минуты

dayjs().startOf('minute')

Результат:

  • секунды = 0
  • миллисекунды = 0

Округление до конца интервала

Метод endOf() устанавливает максимальное значение для выбранной единицы.

Конец часа

dayjs().endOf('hour')

Результат:

  • минуты = 59
  • секунды = 59
  • миллисекунды = 999

Конец минуты

dayjs().endOf('minute')

Взаимодействие компонентов времени

Час, минуты, секунды и миллисекунды связаны между собой через каскадную нормализацию. Изменение младшей единицы может повлиять на старшие.

Пример:

dayjs()
  .hour(10)
  .minute(59)
  .second(59)
  .add(1, 'second')

Результат:

  • минуты увеличиваются
  • секунды сбрасываются
  • возможен переход к следующему часу

Формирование времени из нуля

Создание времени «с нуля» часто используется при построении таймеров и расчётных систем.

dayjs()
  .hour(0)
  .minute(0)
  .second(0)
  .millisecond(0)

Такая конструкция задаёт чистую временную базу без остаточных значений.


Преобразование и вывод времени

После изменения компонентов времени результат обычно форматируется:

dayjs()
  .hour(9)
  .minute(5)
  .second(3)
  .format('HH:mm:ss')

Форматирование:

  • HH — часы (24-часовой формат)
  • mm — минуты
  • ss — секунды

Типичные сценарии работы с временем

Таймер обратного отсчёта

let t = dayjs().hour(0).minute(10).second(0)

t = t.subtract(1, 'second')

Установка фиксированного времени события

const eventTime = dayjs()
  .hour(18)
  .minute(30)
  .second(0)

Синхронизация с интервалом

const aligned = dayjs().startOf('minute')

Поведение при граничных значениях

Day.js корректно обрабатывает переполнение времени:

  • 60 минут → +1 час
  • 60 секунд → +1 минута
  • 1000 миллисекунд → +1 секунда

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


Влияние цепочек на точность времени

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

dayjs()
  .second(50)
  .add(15, 'second')
  .minute(10)

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