Русский

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

Почему timestamp бывает 10 или 13 цифр, как отличить секунды от миллисекунд и где чаще всего появляется ошибка даты.

В интерфейсе внезапно 1970 год. Или наоборот - дата улетела в далёкое будущее. До timezone ещё рано: сначала проверьте, не перепутаны ли секунды и миллисекунды. Код при этом может быть "правильным" с обеих сторон, просто контракт между системами оказался неявным.

Для быстрой проверки откройте конвертер timestamp и сравните обе интерпретации. Это не доказывает причину бага, но быстро проверяет главную гипотезу.

ЗначениеЕсли это секундыЕсли это миллисекунды
1719326400дата вокруг 2024 годаянварь 1970
1719326400000слишком далёкое будущеедата вокруг 2024 года

Быстрая проверка по длине

Для дат вокруг текущих лет timestamp в секундах обычно выглядит как 10 цифр. Это формат из мира Unix: сколько секунд прошло с 1 января 1970 года UTC. Такое часто встречается в логах, backend API и командах вроде date +%s.

Миллисекунды чаще выглядят как 13 цифр. Их любит JavaScript: Date.now() возвращает именно миллисекунды. Клиентская аналитика и браузерные события тоже часто живут в этом формате.

Правило не абсолютное. Старые даты короче, будущие длиннее. Но если у вас "сегодняшняя" дата и число из 13 цифр, почти наверняка это миллисекунды.

Как выглядит перепутанный формат

Если секунды скормить коду, который ждёт миллисекунды, дата падает к январю 1970 года. Передали 1719326400, а new Date() решил, что это миллисекунды. Получилось не лето 2024, а первые недели после Unix epoch.

Обратная ошибка заметнее: миллисекунды прочитали как секунды, и дата улетела куда-то в далёкое будущее. Если в интерфейсе внезапно появился фантастический год, первым делом проверьте единицу timestamp.

Где ошибка появляется чаще всего

Частое место ошибки - граница frontend и backend. Сервер отдаёт секунды, фронтенд передаёт число в new Date(value), JavaScript ждёт миллисекунды. Или браузер отправляет Date.now(), а backend кладёт значение в поле, где команда думала хранить секунды.

Вторая зона риска - аналитика. События из разных систем легко смешиваются: одна пишет seconds, другая milliseconds, третья ISO-строку. До сортировки и сравнения такие значения надо привести к одному виду.

Самая дешёвая профилактика - писать единицу прямо в названии поля: created_at_ms, created_at_seconds, expiresAtMs. createdAt выглядит красиво, но через полгода заставляет угадывать.

Если API уже публичный, лучше зафиксировать единицу в документации и тестах. Менять seconds на milliseconds без версии контракта - верный способ получить часть клиентов в 1970 году.

Вопросы

Почему один timestamp состоит из 10 цифр, а другой из 13?

Обычно 10 цифр означают секунды с 1 января 1970 UTC, а 13 цифр - миллисекунды. Но лучше проверять контекст API или базы данных.

Почему JavaScript показывает 1970 год?

Частая причина - в `new Date()` передали timestamp в секундах, а JavaScript ждёт миллисекунды.

Unix timestamp хранит timezone?

Нет. Timestamp описывает момент времени относительно UTC. Timezone появляется только при отображении этого момента как даты.

Связанные инструменты