Unix timestamp представляет собой числовое значение, отражающее количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC. В экосистеме JavaScript и библиотек работы с датами часто встречаются две формы представления времени:
DateРазличие между ними является источником множества ошибок при работе с датами, особенно при интеграции с API и сторонними сервисами.
Библиотека Day.js оперирует внутренне миллисекундным представлением
времени, аналогичным Date.getTime(). Это означает, что
любое значение даты в Day.js хранится как число миллисекунд от Unix
epoch.
Ключевая особенность:
.unix()Метод .unix() возвращает текущее значение объекта Day.js
в секундах.
import dayjs from 'dayjs';
const now = dayjs();
const timestamp = now.unix();
console.log(timestamp);
Результат — целое число:
1716200000
Особенности поведения:
.unix() от
.valueOf()Методы часто путаются, но возвращают разные единицы измерения:
const d = dayjs();
console.log(d.unix()); // секунды
console.log(d.valueOf()); // миллисекунды
Фактически:
unix() = Math.floor(ms / 1000)valueOf() = msdayjs.unix()Для преобразования Unix timestamp (секунды) в объект Day.js используется статический метод:
const d = dayjs.unix(1716200000);
console.log(d.format());
Особенности:
Передача миллисекунд в dayjs.unix() приводит к
некорректной дате:
// Ошибка
dayjs.unix(1716200000000);
Такое значение воспринимается как секунды и уводит дату далеко в будущее.
Правильный подход:
dayjs(1716200000000);
или явное преобразование:
dayjs.unix(Math.floor(1716200000000 / 1000));
const d = dayjs('2025-01-01');
const seconds = d.unix();
const ms = d.valueOf();
const ms = dayjs.unix(seconds).valueOf();
const seconds = dayjs(ms).unix();
Многие API используют Unix timestamp в секундах:
{
"created_at": 1716200000
}
Обработка:
const createdAt = dayjs.unix(response.created_at);
console.log(createdAt.format('YYYY-MM-DD HH:mm:ss'));
Если API возвращает миллисекунды:
{
"created_at": 1716200000000
}
Используется прямое создание:
const createdAt = dayjs(response.created_at);
const d = new Date();
console.log(d.getTime()); // ms
const d = dayjs();
console.log(d.valueOf()); // ms
console.log(d.unix()); // s
Сравнение:
| Операция | Date | Day.js |
|---|---|---|
| миллисекунды | getTime() |
valueOf() |
| секунды | нет | unix() |
const future = dayjs.unix(1716200000).add(1, 'day').unix();
const past = dayjs().subtract(3600, 'second').unix();
const a = dayjs.unix(1716200000);
const b = dayjs.unix(1716300000);
const diff = b.unix() - a.unix();
Результат выражается в секундах.
dayjs.unix(1716200000).format('DD.MM.YYYY');
dayjs.unix(1716200000).toISOString();
const nativeDate = dayjs.unix(1716200000).toDate();
Unix timestamp всегда основан на UTC и не зависит от временной зоны. Day.js сохраняет это поведение:
dayjs.unix(1716200000).utc().format();
Особенности:
dayjs().unix(); // всегда целое число
Дробные секунды отбрасываются.
Day.js корректно работает с диапазоном:
Date в
некоторых средахdayjs.unix(0)
Соответствует:
1970-01-01 00:00:00 UTC
const record = {
created_at: dayjs().unix()
};
const isExpired = dayjs().unix() > expiryTimestamp;
const cacheKey = `user:${dayjs().unix()}`;
if (dayjs.unix(eventA).unix() < dayjs.unix(eventB).unix()) {
// событие A раньше
}