Разработка · 3 мин чтения ·
Unix-время: секунды или миллисекунды?
Баг с 13 цифрами, который каждую неделю попадает в продакшен, и очень простое правило, как отличить одну единицу от другой.

JavaScript считает в миллисекундах, большинство бэкендов — в секундах. Перепутаете их, и даты окажутся в январе 1970 года или на десятки тысяч лет в будущем.
Посчитайте цифры
Современная метка времени в секундах состоит из 10 цифр (1790000000 — это 21 сентября 2026 года). Тот же момент в миллисекундах занимает 13 цифр, в микросекундах 16, в наносекундах 19.
Правило
Если абсолютное значение больше 10¹², это миллисекунды; иначе считайте его секундами. Правило работает для любой метки в миллисекундах после сентября 2001 года и любой метки в секундах до 33658 года.
const ms = Math.abs(n) > 1e12 ? n : n * 1000;
У метки времени нет часового пояса
Метка времени Unix считает секунды с 1 января 1970 года, 00:00 UTC. Одно и то же число означает один и тот же момент в любой точке мира; меняется только способ отображения. Баги появляются, когда местное время переводят в метку так, будто это UTC: все даты сдвигаются на ваш часовой пояс, часто на час-два, и ещё раз при переходе на летнее время. Храните и передавайте метки в UTC, а в местное время переводите только при показе человеку.
Текущее время в популярных языках
JavaScript Date.now() миллисекунды
JavaScript Math.floor(Date.now() / 1000) секунды
Python time.time() секунды (с дробной частью)
Java System.currentTimeMillis() миллисекунды
Go time.Now().Unix() секунды
PostgreSQL EXTRACT(EPOCH FROM now()) секунды
MySQL UNIX_TIMESTAMP() секунды
Даты до 1970 года и 2038 год
Отрицательные метки времени допустимы: −86400 — это 31 декабря 1969 года. Некоторые старые системы и таблицы с ними не справляются, поэтому даты рождения и исторические данные — частый источник ошибок. С другой стороны, 32-битное целое со знаком заканчивается на 2147483647, то есть 19 января 2038 года в 03:14:07 UTC. Системы, которые до сих пор хранят метки в 32 битах, перескочат в 1901 год; 64-битное хранение снимает проблему на миллиарды лет.
Високосные секунды
Время Unix игнорирует високосные секунды: в каждых сутках ровно 86 400 секунд. Это упрощает арифметику, и почти для любого приложения разница не важна. Учитывать её нужно только системам, которым нужны точные интервалы через високосную секунду, например некоторым научным или финансовым.
Быстрый чек-лист для отладки
- Дата попала в январь 1970 года: значение в секундах прочитали как миллисекунды.
- Год пятизначный: значение в миллисекундах прочитали как секунды.
- Все даты сдвинуты на одно и то же число часов: местное время приняли за UTC или наоборот.
- Часть года даты сдвинуты на час: проигнорирован переход на летнее время.
- Даты перескакивают в 1901 год: переполнение 32-битного числа.
Выбирайте единицу явно
Конвертер временных меток 4Dev не гадает: "Unix Timestamp" — это секунды, а "Unix Timestamp (ms)" — миллисекунды, рядом есть варианты в микро- и наносекундах. Всего 33 формата, включая ISO 8601, RFC 2822, SQL DATETIME и порядковые даты Excel.
ISO 8601, когда дату читают люди
Метки времени идеальны для хранения и вычислений, но людям их трудно читать. В логах, API и файлах, которые открывают люди, формат ISO 8601, например 2026-09-21T14:30:00Z, однозначен, правильно сортируется как текст и явно указывает часовой пояс. Переводить одно в другое — как раз задача конвертера меток времени.