Работа с timestamp

Timestamp — числовое представление момента времени в виде количества миллисекунд, прошедших с 1 января 1970 года (эпоха Unix). Это один из трёх поддерживаемых типов входных данных функции format, наряду с объектами Date и строками.


Передача timestamp напрямую

import { format } from 'timeago.js';

const ts = 1716720000000; // конкретная метка времени

format(ts, 'ru');
// → "5 дней назад" (зависит от текущей даты)

Библиотека принимает timestamp в миллисекундах. Значение передаётся напрямую, без оборачивания в new Date().


Получение текущего timestamp

const now = Date.now(); // миллисекунды

format(now); // → "just now"

Date.now() — наиболее производительный способ получить текущий timestamp. Он не создаёт объект Date и работает быстрее, чем new Date().getTime().


Вычисление временных интервалов

const oneMinute Ago = Date.now() - 1000 * 60;
const oneHour Ago   = Date.now() - 1000 * 60 * 60;
const oneDay Ago    = Date.now() - 1000 * 60 * 60 * 24;
const oneWeek Ago   = Date.now() - 1000 * 60 * 60 * 24 * 7;

format(oneMinuteAgo, 'ru'); // → "1 минуту назад"
format(oneHourAgo,   'ru'); // → "1 час назад"
format(oneDayAgo,    'ru'); // → "1 день назад"
format(oneWeekAgo,   'ru'); // → "1 неделю назад"

Константы для удобства

const SECOND = 1000;
const MINUTE = SECOND * 60;
const HOUR   = MINUTE * 60;
const DAY    = HOUR   * 24;

format(Date.now() - 3 * HOUR, 'ru');   // → "3 часа назад"
format(Date.now() - 10 * DAY, 'ru');   // → "10 дней назад"

Unix timestamp в секундах

Серверные API часто возвращают Unix timestamp в секундах, а не миллисекундах:

{
  "created_at": 1716720000
}

Для timeago.js необходимо умножить на 1000:

const serverTimestamp = 1716720000;

format(serverTimestamp * 1000, 'ru');

Если не умножить, разница будет вычислена неверно — дата окажется в начале 1970-х.


Получение timestamp из объекта Date

const date = new Date('2025-05-26T10:00:00Z');
const ts   = date.getTime(); // или +date

format(ts, 'ru');

+date — краткий способ получить timestamp через унарный плюс.


Сравнение timestamp с Date.now()

const createdAt = 1716720000000;
const diff = Date.now() - createdAt;

console.log(diff); // разница в миллисекундах

format(createdAt, 'ru'); // форматирует автоматически

Вычислять разницу вручную не нужно — format делает это внутри.


Передача отрицательного timestamp

Отрицательные значения означают даты до 1 января 1970 года:

format(-1000 * 60 * 60 * 24 * 365);
// → "54 years ago" (зависит от текущего года)

Timestamp в будущем

const inOneHour = Date.now() + 1000 * 60 * 60;

format(inOneHour, 'ru');
// → "через 1 час"

Библиотека автоматически определяет направление — прошлое или будущее.


Timestamp в localStorage

При сохранении дат в хранилище браузера:

// Сохранение
localStorage.setItem('lastVisit', Date.now().toString());

// Чтение и форматирование
const ts = parseInt(localStorage.getItem('lastVisit'), 10);
format(ts, 'ru');

Timestamp из серверного ответа (JSON)

const response = await fetch('/api/posts');
const data     = await response.json();

data.posts.forEach(post => {
  console.log(format(post.createdAtMs, 'ru'));
});

Если сервер возвращает миллисекунды — передаётся напрямую. Если секунды — умножается на 1000.


Производительность: timestamp vs Date

При форматировании большого списка записей timestamp эффективнее объекта Date:

// Менее эффективно
posts.map(p => format(new Date(p.timestamp), 'ru'));

// Более эффективно — если timestamp уже в мс
posts.map(p => format(p.timestamp, 'ru'));

Разница незначительна для небольших объёмов, но важна при тысячах элементов.


Timestamp и атрибут datetime

Функция render() использует атрибут datetime, который задаётся строкой, а не числом. При работе с render нужно конвертировать timestamp в ISO-строку:

const ts = 1716720000000;
const isoStr = new Date(ts).toISOString();

element.setAttribute('datetime', isoStr);
render(element, 'ru');

Точность timestamp

JavaScript timestamp имеет точность до миллисекунды. Для отображения относительного времени этого более чем достаточно. Для sub-millisecond точности (performance timing) timeago.js не предназначен.


Совместимость с серверными метками времени

Источник Тип Конвертация
JavaScript Date.now() мс Нет
Python time.time() сек * 1000
PHP time() сек * 1000
MySQL UNIX_TIMESTAMP() сек * 1000
PostgreSQL EXTRACT(EPOCH FROM ...) сек * 1000
Java System.currentTimeMillis() мс Нет
Go time.Unix() сек * 1000