Unix timestamp — это количество миллисекунд или
секунд, прошедших с полуночи 1 января 1970 года по UTC. В JavaScript
объект Date хранит время именно в миллисекундах.
Day.js предоставляет удобные методы для работы с timestamp без необходимости вручную преобразовывать даты.
const timestamp = dayjs().valueOf()
console.log(timestamp)
// 1716384123456
Метод valueOf() возвращает количество миллисекунд с Unix
Epoch.
Аналог:
const timestamp = +dayjs()
Также можно использовать стандартный Jav * aScript:
const timestamp = Date.now()
Unix timestamp часто используется именно в секундах. Для этого
применяется метод unix().
const unix = dayjs().unix()
console.log(unix)
// 1716384123
Разница:
| Метод | Единица измерения |
|---|---|
valueOf() |
миллисекунды |
unix() |
секунды |
const date = dayjs(1716384123456)
console.log(date.format())
// 2024-05-22T10:22:03+03:00
Day.js автоматически понимает, что передано число в миллисекундах.
Для Unix timestamp в секундах используется
dayjs.unix().
const date = dayjs.unix(1716384123)
console.log(date.format())
// 2024-05-22T10:22:03+03:00
Важно понимать различие:
dayjs(1716384123)
В этом случае число будет интерпретировано как миллисекунды, а не секунды.
Правильный вариант:
dayjs.unix(1716384123)
Типичная ошибка — путаница единиц измерения.
const apiTimestamp = 1716384123
const date = dayjs(apiTimestamp)
console.log(date.format())
// 1970-01-20T23:46:24+03:00
const apiTimestamp = 1716384123
const date = dayjs.unix(apiTimestamp)
console.log(date.format())
// 2024-05-22T10:22:03+03:00
const ms = dayjs().valueOf()
const seconds = Math.floor(ms / 1000)
console.log(seconds)
const seconds = dayjs().unix()
const ms = seconds * 1000
console.log(ms)
Многие REST API возвращают Unix timestamp.
{
"createdAt": 1716384123
}
const response = {
createdAt: 1716384123
}
const created = dayjs.unix(response.createdAt)
console.log(created.format('DD.MM.YYYY HH:mm:ss'))
Разные базы данных используют разные форматы времени:
| Система | Формат |
|---|---|
| PostgreSQL | timestamp |
| MongoDB | ISODate |
| Redis | Unix timestamp |
| SQLite | integer timestamp |
Day.js позволяет унифицировать обработку времени независимо от источника данных.
const dbTimestamp = 1716384123456
const formatted = dayjs(dbTimestamp)
.format('YYYY-MM-DD HH:mm:ss')
console.log(formatted)
const date = dayjs(1716384123456)
console.log(date.isValid())
// true
const date = dayjs('invalid')
console.log(date.isValid())
// false
Unix timestamp всегда хранится независимо от часового пояса.
const timestamp = 1716384123456
const local = dayjs(timestamp)
console.log(local.format())
При отображении применяется локальная временная зона системы.
Для корректной работы с серверным временем часто используется UTC.
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
const timestamp = 1716384123456
const date = dayjs.utc(timestamp)
console.log(date.format())
// 2024-05-22T07:22:03Z
Сравнение чисел работает быстрее, чем сравнение объектов даты.
const first = dayjs('2024-01-01').valueOf()
const second = dayjs('2025-01-01').valueOf()
console.log(first < second)
// true
const start = dayjs('2024-01-01')
const end = dayjs('2024-01-02')
const diff = end.diff(start)
console.log(diff)
// 86400000
const start = dayjs('2024-01-01')
const end = dayjs('2024-01-01 00:01:30')
const diff = end.diff(start, 'second')
console.log(diff)
// 90
Day.js подходит для работы с календарным временем, но не предназначен для высокоточных измерений производительности.
Для замеров производительности лучше использовать:
performance.now()
Пример:
const start = performance.now()
for (let i = 0; i < 1000000; i++) {}
const end = performance.now()
console.log(end - start)
const data = {
createdAt: dayjs().valueOf()
}
const json = JSON.stringify(data)
console.log(json)
const iso = dayjs().toISOString()
console.log(iso)
// 2024-05-22T07:22:03.456Z
const posts = [
{ id: 1, createdAt: 1716384000000 },
{ id: 2, createdAt: 1716385000000 },
{ id: 3, createdAt: 1716383000000 }
]
posts.sort((a, b) => a.createdAt - b.createdAt)
console.log(posts)
Timestamp часто используется как основа для генерации идентификаторов.
const id = `post_${dayjs().valueOf()}`
console.log(id)
Однако при высокой нагрузке несколько операций могут произойти в одну миллисекунду.
Веб-приложения часто используют timestamp для контроля актуальности данных.
const cache = {
data: null,
updatedAt: null
}
cache.updatedAt = dayjs().valueOf()
const isExpired =
dayjs().diff(dayjs(cache.updatedAt), 'minute') > 5
console.log(isExpired)
const timestamp = 1716384123456
const result = dayjs(timestamp)
.format('DD.MM.YYYY HH:mm:ss')
console.log(result)
// 22.05.2024 10:22:03
import 'dayjs/locale/ru'
dayjs.locale('ru')
const timestamp = 1716384123456
console.log(
dayjs(timestamp).format('D MMMM YYYY')
)
addconst future = dayjs()
.add(7, 'day')
.valueOf()
console.log(future)
subtractconst past = dayjs()
.subtract(1, 'month')
.unix()
console.log(past)
const expiresAt = dayjs()
.add(1, 'hour')
.valueOf()
const isExpired = dayjs().valueOf() > expiresAt
console.log(isExpired)
dayjs(1716384123)
dayjs.unix(1716384123)
dayjs('1716384123456')
Строка может интерпретироваться некорректно в разных окружениях.
Надёжнее:
dayjs(Number('1716384123456'))
const seconds = dayjs().valueOf() / 1000
Результат может содержать дробную часть.
Корректнее:
const seconds = Math.floor(
dayjs().valueOf() / 1000
)
const token = {
value: 'abc123',
expiresAt: dayjs()
.add(2, 'hour')
.valueOf()
}
const isExpired =
dayjs().valueOf() > token.expiresAt
console.log(isExpired)
const post = {
title: 'Новость',
createdAt: 1716384123
}
const created = dayjs
.unix(post.createdAt)
.format('DD.MM.YYYY HH:mm')
console.log(created)
const createdAt = dayjs.unix(1716384123)
const minutesAgo = dayjs().diff(createdAt, 'minute')
console.log(minutesAgo)
const events = [
{ id: 1, ts: 1716380000000 },
{ id: 2, ts: 1716390000000 },
{ id: 3, ts: 1716400000000 }
]
const now = dayjs().valueOf()
const futureEvents = events.filter(
event => event.ts > now
)
console.log(futureEvents)
const start = dayjs()
setTimeout(() => {
const end = dayjs()
console.log(end.diff(start))
}, 1000)
Day.js работает поверх стандартного Date.
const nativeDate = dayjs().toDate()
console.log(nativeDate)
const date = new Date()
const d = dayjs(date)
console.log(d.format())
| Сценарий | Рекомендуемый формат |
|---|---|
| JavaScript | миллисекунды |
| REST API | секунды |
| Базы данных | зависит от системы |
| Логи | миллисекунды |
| Сравнение времени | миллисекунды |
| Unix-системы | секунды |
| Метод | Назначение |
|---|---|
valueOf() |
timestamp в миллисекундах |
unix() |
timestamp в секундах |
dayjs(number) |
создание даты из миллисекунд |
dayjs.unix(number) |
создание даты из секунд |
diff() |
разница между датами |
toISOString() |
ISO-представление даты |