Разработка · 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, однозначен, правильно сортируется как текст и явно указывает часовой пояс. Переводить одно в другое — как раз задача конвертера меток времени.

Открыть конвертер временных меток

LinkedInXFacebook