Час, минута, секунда, миллисекунда

Работа с компонентами времени в Luxon строится вокруг четырёх базовых единиц: часов, минут, секунд и миллисекунд. Эти значения представлены как часть объекта DateTime, а также как элементы Duration, что позволяет управлять временем как в абсолютной, так и в относительной форме.

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


Представление времени в DateTime

Объект DateTime содержит доступ к компонентам времени через свойства:

  • hour — часы (0–23)
  • minute — минуты (0–59)
  • second — секунды (0–59)
  • millisecond — миллисекунды (0–999)
import { DateTime } from "luxon";

const dt = DateTime.local(2026, 5, 23, 14, 35, 48, 123);

dt.hour;        // 14
dt.minute;      // 35
dt.second;      // 48
dt.millisecond; // 123

Эти значения всегда соответствуют локальному или заданному часовому поясу (zone), что делает их зависимыми от контекста объекта.


Установка компонентов времени

Изменение времени выполняется через методы set и reconfigure-подобные операции, где создаётся новый экземпляр DateTime.

Метод set

const base = DateTime.local(2026, 5, 23, 10, 0, 0);

const upd ated = base.se t({
  hour: 18,
  minute: 45,
  second: 30,
  millisecond: 500
});

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

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

const dt = DateTime.local(2026, 5, 23, 10, 0, 0);

const normalized = dt.set({
  minute: 120
});

// результат: +2 часа, 0 минут
normalized.hour;   // 12
normalized.minute; // 0

Арифметика времени: добавление и вычитание

Luxon предоставляет методы plus и minus, которые работают с компонентами времени как с дельтами.

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

const dt = DateTime.local(2026, 5, 23, 10, 15, 30);

const result = dt.plus({
  hours: 2,
  minutes: 30,
  seconds: 10,
  milliseconds: 250
});

Каждая единица добавляется каскадно:

  • миллисекунды переносятся в секунды
  • секунды — в минуты
  • минуты — в часы

Вычитание времени

const dt = DateTime.local(2026, 5, 23, 10, 15, 30);

const result = dt.minus({
  hours: 1,
  minutes: 20,
  seconds: 5
});

При вычитании действует та же система переноса, но в обратном направлении.


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

Любая операция, связанная с компонентами времени, приводит к нормализации.

Пример переполнения секунд

const dt = DateTime.local(2026, 5, 23, 10, 0, 50);

const result = dt.plus({ seconds: 75 });

Результат:

  • 50 + 75 = 125 секунд
  • 125 секунд = 2 минуты 5 секунд

Итог:

  • минуты увеличиваются на 2
  • секунды становятся 5

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

Метод startOf позволяет привести время к началу выбранной единицы.

const dt = DateTime.local(2026, 5, 23, 14, 37, 52, 789);

dt.startOf("hour");

Результат:

  • minute = 0
  • second = 0
  • millisecond = 0

Аналогично:

dt.startOf("minute"); // seconds и milliseconds = 0
dt.startOf("second"); // milliseconds = 0

Округление времени: endOf

Противоположная операция — установка времени в конец единицы.

dt.endOf("hour");

Результат:

  • minute = 59
  • second = 59
  • millisecond = 999

Это часто используется при построении диапазонов времени.


Работа с миллисекундами как наименьшей единицей

Миллисекунда является минимальной единицей в DateTime, но в Duration возможны и более крупные комбинации.

const dt = DateTime.local(2026, 5, 23, 10, 0, 0);

const precise = dt.plus({ milliseconds: 1 });

При высокой частоте операций важно учитывать, что JavaScript таймеры и системное время могут не гарантировать абсолютную точность на уровне 1–10 мс.


Объект Duration и компоненты времени

Duration представляет время как интервал, а не как момент.

import { Duration } from "luxon";

const dur = Duration.fromObject({
  hours: 1,
  minutes: 30,
  seconds: 15,
  milliseconds: 500
});

Доступ к компонентам:

dur.hours;        // 1
dur.minutes;      // 30
dur.seconds;      // 15
dur.milliseconds; // 500

Нормализация Duration

Как и DateTime, длительности нормализуются:

const dur = Duration.fromObject({
  seconds: 90
});

Результат:

  • minutes = 1
  • seconds = 30

Преобразование между DateTime и Duration

Из DateTime в Duration

const dt = DateTime.local(2026, 5, 23, 14, 20, 10, 250);

const dur = dt.diff(DateTime.local(2026, 5, 23, 0, 0, 0, 0));

Результат содержит:

  • часы
  • минуты
  • секунды
  • миллисекунды

Применение Duration к DateTime

const dt = DateTime.local(2026, 5, 23, 10, 0, 0);

const result = dt.plus(Duration.fromObject({
  hours: 3,
  minutes: 15,
  seconds: 40
}));

Извлечение компонентов через форматирование

Хотя прямые свойства предпочтительнее, часто используется форматирование:

const dt = DateTime.local(2026, 5, 23, 9, 5, 3, 7);

dt.toFormat("HH:mm:ss.SSS");

Результат:

09:05:03.007

Особенности работы с часовыми поясами

Компоненты времени зависят от зоны:

const dt = DateTime.fromObject(
  { hour: 10, minute: 0 },
  { zone: "Europe/Paris" }
);

При смене зоны:

dt.setZone("UTC");

значения hour, minute, second, millisecond могут измениться, хотя абсолютный момент времени остаётся тем же.


Поведение при переходе через границы суток

При добавлении часов возможен переход на следующий день:

const dt = DateTime.local(2026, 5, 23, 23, 0, 0);

const result = dt.plus({ hours: 2 });

Результат:

  • дата увеличивается на 1 день
  • час становится 01

Точность и ограничения модели

  • millisecond — минимальная доступная единица
  • субмиллисекундная точность не поддерживается
  • вычисления основаны на стандартной JS Date
  • возможны погрешности при длительных цепочках операций

Инкрементальные операции с компонентами

Помимо plus и minus, возможно точечное изменение:

const dt = DateTime.local();

const upd ated = dt.se t({
  second: dt.second + 10
});

Однако такой подход менее предпочтителен из-за необходимости ручной нормализации.


Взаимодействие компонентов между собой

Компоненты времени всегда связаны:

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

Эта связь обеспечивает целостность времени и исключает рассинхронизацию значений внутри объекта.