Конвертер Unix-времени
Переведите Unix-метку времени в читаемую дату в любом часовом поясе, а дату — обратно в epoch.
Что такое Unix-метка времени
Unix-метка времени — её также называют epoch-временем или POSIX-временем — это одно число, считающее, сколько секунд прошло с 00:00:00 UTC 1 января 1970 года, момента, известного как Unix-эпоха. Поскольку это одно целое число, без часового пояса, без календаря и без форматирования, именно к этому формату обращаются компьютеры всякий раз, когда момент времени нужно сохранить, отсортировать, сравнить или передать по сети. Это то, что стоит за столбцом «created_at» в вашей базе данных, за полями «iat» и «exp» в JWT, за mtime файла и за метками времени почти в любом журнале, который вам доведётся читать.
Плата за это — голое число ничего не говорит человеку. 1716197600 — вполне корректный момент, но с первого взгляда не понять, прошлый ли это вторник или три года назад. Именно этот перевод, в обе стороны, и делает данный инструмент.
Секунды или миллисекунды — двусмысленность, которая кусается
Исходное соглашение Unix считает целые секунды, и именно это возвращают date +%s в оболочке, time() в PHP и time.time() в Python после отбрасывания дробной части. JavaScript, Java и многие другие считают миллисекунды: Date.now() возвращает число в тысячу раз больше. И то и другое называют «меткой времени», а их смешение — одна из самых частых ошибок с датами вообще.
Сбой здесь тихий, а не громкий. Прочитайте значение в миллисекундах как секунды — и дата улетит на десятки тысяч лет вперёд; прочитайте значение в секундах как миллисекунды — и всё схлопнется в январь 1970 года. Ни в том, ни в другом случае ошибки не будет: вы просто получите неверную дату, выглядящую как настоящая.
Этот инструмент угадывает по порядку величины числа, а затем сообщает вам, что именно он угадал, прямо рядом с результатом. Сегодняшние epoch-секунды состоят из десяти цифр, а миллисекунды — из тринадцати, поэтому догадка почти всегда верна. Но «почти» недостаточно для значения, которое вы вот-вот вставите в отчёт об ошибке, — поэтому выбранная трактовка всегда на виду и всегда в одном щелчке от переключения.
Часовые пояса, UTC и почему «местное» — скользкое понятие
У Unix-метки времени нет часового пояса. Она обозначает момент, и этот же самый момент одновременно есть 09:33 в Лондоне, 11:33 в Иерусалиме и 18:33 в Токио. Часовой пояс не входит в значение; это линза, через которую вы на него смотрите.
Поэтому инструмент показывает сразу несколько линз. UTC — нейтральная точка отсчёта, с которой согласны все серверы и журналы. Ваше местное время — то, о котором сообщает ваше собственное устройство; оно показано с именем пояса (например, Europe/Berlin), чтобы вы всегда знали, какая линза его дала: определение происходит в вашем браузере, поэтому посетитель из Берлина видит берлинское время, а из Токио — токийское. Третья строка — любой пояс на ваш выбор из полной базы IANA, и именно она нужна, когда вы читаете журнал сервера, стоящего где-то ещё.
- UTC — точка отсчёта, с которой согласны все системы, и то, что правильно хранить и записывать в журналы.
- Местное — тот же момент, каким его видит ваше устройство, с пометкой об определённом поясе.
- Пояс на ваш выбор — для чтения журналов и трассировок с машин в других местах.
- ISO 8601 — текстовый формат обмена, например 2024-05-20T09:33:20.000Z.
- Относительно — «3 часа назад», чтобы быстро понять, насколько это свежее.
Смещения показаны рядом с каждым временем (+03:00, -04:00), потому что они не постоянны: большинство поясов сдвигаются на час из-за перехода на летнее время, так что один и тот же пояс может давать разные смещения в разное время года. Дата вблизи перехода — как раз то место, где ручные подсчёты дают сбой.
Работа с epoch-временем на практике
В каждом языке и в каждой оболочке свой способ получать и читать epoch-значения. Эти стоит запомнить:
date +%s # оболочка: текущее время в секундах date -d @1716197600 # оболочка (GNU): из секунд в дату Date.now() # JavaScript: текущее время в МИЛЛИсекундах new Date(1716197600 * 1000) # JavaScript: из секунд в Date time.time() # Python: секунды, как дробное число datetime.fromtimestamp(1716197600, tz=timezone.utc) SELECT EXTRACT(EPOCH FROM now()) -- PostgreSQL: секунды
Правило, избавляющее от большей части боли с датами: храните и передавайте моменты в UTC — либо целым epoch-числом, либо строкой ISO 8601 — и переводите в местный пояс только в самый последний момент, когда действительно показываете их человеку. Слишком раннее форматирование — это то, как ошибка часового пояса запекается в ваши данные вместо того, чтобы остаться в слое отображения.
Ещё одно, о чём стоит знать: знаковый 32-битный счётчик секунд исчерпывается 19 января 2038 года — «проблема 2038 года». Современные системы используют 64-битные значения и в безопасности, но старые встраиваемые устройства и унаследованные столбцы баз данных — как раз те места, где с ней ещё можно столкнуться.
Частые вопросы
- Как инструмент понимает, секунды у меня или миллисекунды?
- По порядку величины: значения примерно до 1e11 читаются как секунды, большие — как миллисекунды. Сегодня это чётко отделяет десятизначные секунды от тринадцатизначных миллисекунд. Трактовка показана рядом с результатом, и её можно переключить одним щелчком, так что догадка никогда от вас не скрыта.
- Какой часовой пояс считается «местным»?
- Тот, о котором сообщает ваше собственное устройство; он определяется в браузере и показан по имени, чтобы не оставалось сомнений. Это ваш пояс, а не пояс сайта: посетитель из Берлина видит берлинское время, а из Токио — токийское.
- Можно ли перевести дату обратно в метку времени?
- Да. Одно и то же поле принимает оба направления: введите число — получите дату; введите дату вида 2024-05-20 или 2024-05-20T09:33:20Z — получите epoch-значение. Никакой режим переключать не нужно.
- Работает ли он с датами до 1970 года?
- Да. Метки времени до эпохи просто отрицательные — -86400 это 31 декабря 1969 года — и отрицательные значения принимаются и преобразуются как обычно.
- Почему моя метка времени показывает не ту дату, которую я ожидал?
- Почти всегда по одной из двух причин: трактовка секунды/миллисекунды не та, которую вы предполагали (посмотрите на подпись и переключите её), либо вы сравниваете значение в UTC с ожиданием в местном времени. Инструмент показывает обе строки рядом, чтобы вы увидели, какой из случаев ваш.
- Что такое проблема 2038 года?
- Системы, хранящие epoch-секунды в знаковом 32-битном целом, переполняются 19 января 2038 года и переходят к отрицательному числу, давая даты в 1901 году. Всё, что использует 64-битные значения — то есть почти всё современное — не затронуто, но унаследованные встраиваемые системы и старые столбцы баз данных всё ещё могут быть в зоне риска.
- Отправляется ли куда-нибудь введённая мной метка времени?
- Нет. Разбор, преобразование и форматирование выполняются целиком в вашем браузере, с опорой на собственную поддержку дат и часовых поясов в платформе. Ничто из набранного вами не покидает ваше устройство.