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

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

Ключевое свойство модели — единый источник измерения времени (epoch milliseconds), от которого строятся все вычисления и преобразования.


Базовое преобразование: миллисекунды, секунды и Unix-время

Day.js предоставляет несколько способов извлечения и преобразования временных значений в базовые единицы.

Получение timestamp в миллисекундах

const d = dayjs();

const ms = d.valueOf();

Метод valueOf() возвращает количество миллисекунд с 1970 года.


Получение Unix-времени в секундах

const d = dayjs();

const seconds = d.unix();

Unix-время — это целое число секунд, что удобно для API и хранения в базах данных.


Преобразование секунд в Day.js объект

const d = dayjs.unix(1700000000);

Преобразование между единицами через diff

Метод diff позволяет вычислять разницу между двумя датами в заданной единице измерения.

const a = dayjs('2024-01-01');
const b = dayjs('2024-01-02');

const diffDays = b.diff(a, 'day');

Поддерживаемые единицы:

  • millisecond
  • second
  • minute
  • hour
  • day
  • week
  • month
  • year

Пример точных и дробных значений

const a = dayjs('2024-01-01 00:00:00');
const b = dayjs('2024-01-01 12:00:00');

b.diff(a, 'hour'); // 12
b.diff(a, 'day');  // 0

По умолчанию результат округляется вниз.

Для получения дробных значений используется третий параметр:

b.diff(a, 'day', true); // 0.5

Конвертация через добавление и вычитание единиц

Преобразование значений часто выполняется через операции add и subtract, где единицы задаются явно.

const base = dayjs();

const inMinutes = base.add(60, 'minute');
const inHours = base.add(2, 'hour');
const inDays = base.add(1, 'day');

Модель преобразования здесь опирается не на прямую конвертацию, а на сдвиг точки времени.


Работа с длительностями через plugin duration

Для прямого преобразования между единицами используется плагин duration.

import duration from 'dayjs/plugin/duration';
dayjs.extend(duration);

Создание длительности из миллисекунд

const d = dayjs.duration(3600000);

3600000 миллисекунд соответствует одному часу.


Получение значений в разных единицах

const d = dayjs.duration(90061000);

d.hours();   // 25
d.minutes(); // 1501
d.seconds(); // 90061

Важно учитывать: методы возвращают остаточные значения, а не полную нормализацию.


Полная нормализация через цепочку единиц

Для получения «чистого» разбиения используется комбинация методов:

const d = dayjs.duration(90061000);

const hours = Math.floor(d.asHours());
const minutes = d.minutes();
const seconds = d.seconds();

Преобразование миллисекунд в человеко-читаемые единицы

Day.js не предоставляет прямой универсальной функции конвертации, поэтому используется комбинация duration и методов извлечения.

Пример: миллисекунды → минуты

const ms = 300000;

const minutes = dayjs.duration(ms).asMinutes(); // 5

Пример: миллисекунды → часы

const ms = 7200000;

const hours = dayjs.duration(ms).asHours(); // 2

Метод asX() возвращает вещественное число без округления вниз.


Обратное преобразование единиц в миллисекунды

Преобразование в миллисекунды осуществляется через ручное умножение или через duration API.

Через duration

const ms = dayjs.duration(2, 'hour').asMilliseconds();

Ручное преобразование

const ms = 2 * 60 * 60 * 1000;

Перевод между часами, минутами и секундами

Часы → минуты

const hours = 3;
const minutes = dayjs.duration(hours, 'hour').asMinutes();

Минуты → секунды

const minutes = 10;
const seconds = dayjs.duration(minutes, 'minute').asSeconds();

Секунды → часы

const seconds = 7200;
const hours = dayjs.duration(seconds, 'second').asHours();

Особенности округления при преобразованиях

В Day.js различаются два подхода:

  • diff — целочисленное значение (округление вниз)
  • duration.asX() — дробное значение без округления
  • ручное преобразование — полный контроль над округлением

Пример различий

const a = dayjs('2024-01-01 00:00:00');
const b = dayjs('2024-01-01 01:30:00');

b.diff(a, 'hour');        // 1
dayjs.duration(b.diff(a)).asHours(); // 1.5

Преобразование календарных единиц

Некоторые единицы не имеют фиксированного количества времени (месяцы, годы). Day.js учитывает календарную природу этих значений.

const a = dayjs('2024-01-01');
const b = a.add(1, 'month');

При конвертации:

  • 1 month ≠ фиксированное количество дней
  • 1 year зависит от високосности

Приближённые преобразования через duration

dayjs.duration(1, 'year').asDays();

Результат является усреднённым значением.


Перевод ISO-строк и строковых интервалов

Day.js парсит ISO-строки и позволяет преобразовывать их в временные значения для дальнейших операций.

const d = dayjs('2024-01-01T12:00:00Z');

Дальнейшее преобразование выполняется через diff, add, duration.


Смешанные преобразования и цепочки операций

Пример: секунды → минуты → часы

const seconds = 7200;

const hours = dayjs.duration(seconds, 'second')
  .asMinutes() / 60;

Пример: timestamp → дни

const ms = Date.now();

const days = dayjs.duration(ms).asDays();

Особенности точности вычислений

При многократных преобразованиях возникает накопление дробных ошибок, особенно при работе с месяцами и годами.

Рекомендуемые практики:

  • для точных вычислений использовать миллисекунды
  • для календарных операций использовать add, subtract
  • для анализа длительности использовать duration

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

const start = dayjs('2024-01-01');
const end = dayjs('2024-02-01');

const days = end.diff(start, 'day');
const months = end.diff(start, 'month');

Унифицированный подход к единицам времени

Day.js разделяет два уровня работы с единицами:

  • Календарный уровень: add, subtract, diff
  • Математический уровень: duration, asX, milliseconds

Такое разделение позволяет работать как с точными временными интервалами, так и с календарными величинами без потери контекста.