В библиотеке Day.js работа с временными значениями строится вокруг стандартных единиц: миллисекунды, секунды, минуты, часы, дни, недели, месяцы и годы. Все операции внутри ядра опираются на внутреннее представление даты как количества миллисекунд с начала эпохи Unix, что делает преобразования между единицами предсказуемыми и согласованными.
Ключевое свойство модели — единый источник измерения времени (epoch milliseconds), от которого строятся все вычисления и преобразования.
Day.js предоставляет несколько способов извлечения и преобразования временных значений в базовые единицы.
const d = dayjs();
const ms = d.valueOf();
Метод valueOf() возвращает количество миллисекунд с 1970
года.
const d = dayjs();
const seconds = d.unix();
Unix-время — это целое число секунд, что удобно для API и хранения в базах данных.
const d = dayjs.unix(1700000000);
Метод diff позволяет вычислять разницу между двумя
датами в заданной единице измерения.
const a = dayjs('2024-01-01');
const b = dayjs('2024-01-02');
const diffDays = b.diff(a, 'day');
Поддерживаемые единицы:
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');
Модель преобразования здесь опирается не на прямую конвертацию, а на сдвиг точки времени.
Для прямого преобразования между единицами используется плагин
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.
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');
При конвертации:
dayjs.duration(1, 'year').asDays();
Результат является усреднённым значением.
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;
const ms = Date.now();
const days = dayjs.duration(ms).asDays();
При многократных преобразованиях возникает накопление дробных ошибок, особенно при работе с месяцами и годами.
Рекомендуемые практики:
add,
subtractdurationconst 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, diffduration,
asX, millisecondsТакое разделение позволяет работать как с точными временными интервалами, так и с календарными величинами без потери контекста.