Unix timestamp и миллисекунды

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()

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

Unix timestamp часто используется именно в секундах. Для этого применяется метод unix().

const unix = dayjs().unix()

console.log(unix)
// 1716384123

Разница:

Метод Единица измерения
valueOf() миллисекунды
unix() секунды

Создание даты из timestamp

Из миллисекунд

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)

Работа с timestamp в API

Многие 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'))

Timestamp и базы данных

Разные базы данных используют разные форматы времени:

Система Формат
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)

Проверка timestamp

Проверка валидности

const date = dayjs(1716384123456)

console.log(date.isValid())
// true

Невалидное значение

const date = dayjs('invalid')

console.log(date.isValid())
// false

Timestamp и часовые пояса

Unix timestamp всегда хранится независимо от часового пояса.

const timestamp = 1716384123456

const local = dayjs(timestamp)

console.log(local.format())

При отображении применяется локальная временная зона системы.

UTC и timestamp

Для корректной работы с серверным временем часто используется UTC.

Подключение плагина

import utc from 'dayjs/plugin/utc'

dayjs.extend(utc)

Работа с UTC

const timestamp = 1716384123456

const date = dayjs.utc(timestamp)

console.log(date.format())
// 2024-05-22T07:22:03Z

Сравнение timestamp

Что быстрее

Сравнение чисел работает быстрее, чем сравнение объектов даты.

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)

Сериализация timestamp

В JSON

const data = {
  createdAt: dayjs().valueOf()
}

const json = JSON.stringify(data)

console.log(json)

В строку ISO

const iso = dayjs().toISOString()

console.log(iso)
// 2024-05-22T07:22:03.456Z

Timestamp в сортировке

Сортировка по времени

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 и кеширование

Веб-приложения часто используют timestamp для контроля актуальности данных.

const cache = {
  data: null,
  updatedAt: null
}

cache.updatedAt = dayjs().valueOf()

Проверка устаревания

const isExpired =
  dayjs().diff(dayjs(cache.updatedAt), 'minute') > 5

console.log(isExpired)

Преобразование timestamp в читаемый формат

const timestamp = 1716384123456

const result = dayjs(timestamp)
  .format('DD.MM.YYYY HH:mm:ss')

console.log(result)
// 22.05.2024 10:22:03

Использование locale вместе с timestamp

import 'dayjs/locale/ru'

dayjs.locale('ru')

const timestamp = 1716384123456

console.log(
  dayjs(timestamp).format('D MMMM YYYY')
)

Работа с будущими и прошедшими датами

Timestamp через add

const future = dayjs()
  .add(7, 'day')
  .valueOf()

console.log(future)

Timestamp через subtract

const past = dayjs()
  .subtract(1, 'month')
  .unix()

console.log(past)

Сравнение timestamp с текущим временем

const expiresAt = dayjs()
  .add(1, 'hour')
  .valueOf()

const isExpired = dayjs().valueOf() > expiresAt

console.log(isExpired)

Частые ошибки

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

dayjs(1716384123)

Правильный вариант

dayjs.unix(1716384123)

Использование строкового timestamp

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

Day.js работает поверх стандартного Date.

Получение Date

const nativeDate = dayjs().toDate()

console.log(nativeDate)

Создание Day.js из Date

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-представление даты