Конвертер Unix-времени
Метки времени в даты и обратно — единица измерения определяется автоматически и указывается явно.
Оставьте пустым, чтобы увидеть текущее время. Просто число читается как метка времени Unix.
Считаем цифры
Единственная по-настоящему хитрая часть чтения метки времени — определить её единицу, и порядок величины всё решает. На практике неоднозначности нет: для любых дат, с которыми реально работают, диапазоны не пересекаются.
| Цифр | Единица | Пример | Откуда берётся |
|---|---|---|---|
| 10 | Секунды | 1787788800 | Unix, PHP, большинство API, утверждения JWT |
| 13 | Миллисекунды | 1787788800000 | JavaScript, Java, Kafka |
| 16 | Микросекунды | 1787788800000000 | Python time_ns()/1000, внутренности Postgres |
| 19 | Наносекунды | 1787788800000000000 | Go, InfluxDB, Prometheus |
Ошибка здесь — это промах в тысячу раз, так что результат попадает либо в начало 1970-х, либо на десятки тысяч лет вперёд. Очевидно, когда смотришь на это в упор; совершенно незаметно, когда это один столбец в таблице логов, — а кусается оно именно там.
Что на самом деле считает время Unix
Секунды с 00:00:00 UTC 1 января 1970 года в предположении, что каждые сутки длятся ровно 86 400 секунд.
Это предположение ложно. Високосные секунды вставляют раз в несколько лет, чтобы атомное время не расходилось с вращением Земли, которое постепенно замедляется. Время Unix их не отражает: системы повторяют секунду или «размазывают» её по суткам, лишь бы счёт оставался равномерным.
Следствие в том, что время Unix — не настоящий счёт прошедших с 1970 года секунд; оно отстаёт примерно на двадцать семь секунд. Для расписаний, журналов и сроков истечения это ровно правильный размен: равномерная арифметика важнее астрономической точности. А для измерения действительно прошедшего времени берите монотонные часы — настенные к тому же могут прыгнуть назад, когда их поправит NTP.
Проблема 2038 года
Знаковое 32-битное целое вмещает до 2 147 483 647, что как метка времени Unix означает 03:14:07 UTC 19 января 2038 года. Секундой позже оно переполняется в отрицательное, и дата становится декабрём 1901-го.
Всё современное использует 64 бита и годится примерно на 292 миллиарда лет. Несовременное — это встроенные прошивки, промышленные контроллеры, некоторые старые типы столбцов в СУБД и код на C, всё ещё полагающий time_t 32-битным. Больше всего рискуют системы, на которые никто не смотрит, — именно это сделало дорогой и проблему Y2K.
Какой формат использовать на самом деле
ISO 8601 в UTC — для всего, что пересекает границу между системами или читается человеком:
2026-08-27T14:30:00ZОн однозначен, правильно сортируется как обычная строка и читается в логе в два часа ночи. Z здесь важна: без неё большинство парсеров считают время местным, и вы изобрели ошибку, которая проявляется только у пользователей из других стран.
Секунды Unix вполне годятся внутри системы — их используют утверждения exp и iat в JWT, а сравнение целых дёшево. Расплата в том, что они нечитаемы и приглашают ту самую путаницу с единицами.
Избегать стоит любого формата со смещением, но без идентификатора зоны (+01:00 не говорит, BST это или CET, а для будущих дат это важно), и всего из области 03/04/2026, что означает два разных дня в зависимости от того, по какую сторону Атлантики вы это читаете.
Хранение будущих событий
Тонкость, на которой попадаются. Для встречи в 09:00 в марте следующего года хранить UTC неверно: если до тех пор правила часовых поясов изменятся — а правительства их меняют, — встреча уедет. Будущие локальные события следует хранить как местное время плюс идентификатор зоны (Europe/London) и преобразовывать при показе по действующим на тот момент правилам. С прошедшими событиями наоборот: UTC, потому что случившееся уже неизменно.
Смежное
Утверждения exp и iat в JWT — это секунды Unix; декодер JWT переводит их за вас и отмечает истечение срока. Если вам нужно не преобразование, а расписание, разборщик cron покажет, когда оно сработает в следующий раз.
Вопросы о метках времени
Моя метка времени в секундах или в миллисекундах?
Посчитайте цифры. Текущая метка в секундах — это 10 цифр, и так будет до ноября 2286 года; в миллисекундах — 13. Шестнадцать цифр — микросекунды, девятнадцать — наносекунды. Ошибка здесь смещает ответ в тысячу раз, и вы оказываетесь либо сразу после 1970 года, либо где-то в 56000-м — очевидно, если посмотреть, и совершенно незаметно в логе. Конвертер сообщает, какую единицу он предположил, и позволяет её переопределить.
Что за проблема 2038 года?
Системы, хранящие время Unix в знаковом 32-битном целом, переполнятся 19 января 2038 года и уйдут в декабрь 1901-го. Всё современное использует 64 бита, и этого хватит примерно на 292 миллиарда лет. Не в порядке другое: встроенные прошивки, старые СУБД, некоторые форматы файловых систем и любой код на C, всё ещё использующий 32-битный time_t. По форме это та же проблема, что и Y2K, и, как и в случае с Y2K, её по большей части тихо решат заранее люди, о которых вы никогда не услышите.
Почему метки времени игнорируют високосные секунды?
Потому что время Unix определено как число секунд с начала эпохи в предположении, что в сутках ровно 86 400 секунд, — а это неправда: високосные секунды время от времени вставляют, чтобы часы не расходились с вращением Земли. Вместо того чтобы их представлять, большинство систем повторяют или «размазывают» секунду, лишь бы счёт оставался ровным. Значит, время Unix не является настоящим счётчиком прошедших секунд, и почти для любой задачи это правильный размен.
Какой формат использовать в API?
ISO 8601 в UTC, с суффиксом Z: 2026-08-27T14:30:00Z. Он однозначен, правильно сортируется как строка и читается человеком, который разбирает лог в два часа ночи. Секунды Unix вполне годятся внутри системы и используются в утверждениях JWT, но глазами их не прочесть, и они приглашают ту самую путаницу «секунды или миллисекунды». Избегать стоит любого формата с локальным смещением, но без зоны, и всего, что попадает на территорию «DD/MM или MM/DD».
Почему дата показывает не тот день, что я ожидал?
Почти всегда дело в границе часовых поясов. Строку ISO без зоны большинство парсеров считает местным временем, а строку, оканчивающуюся на Z, — временем UTC. Поэтому метка позднего вечера в Лондоне в UTC — это уже следующий день, а раннего утра в Лос-Анджелесе — ещё предыдущий. Храните и передавайте в UTC, а преобразуйте только при отображении.
Последняя проверка . Заметили, что что-то устарело? Напишите нам.
