Перевод между метками времени Unix и датами в обе стороны. Значения из 10 цифр (секунды) и 13 цифр (миллисекунды) распознаются автоматически, местный часовой пояс и UTC переключаются одним щелчком. Все вычисления идут локально в браузере, никакие данные никуда не отправляются.
О метках времени Unix
Что на самом деле означает метка времени?
Метка времени Unix — это целое число: количество секунд, прошедших с момента 00:00:00 UTC 1 января 1970 года до нужного вам мгновения. В ней нет ни часового пояса, ни формата — это просто число, и именно это делает её полезной: любая машина на планете получает для одного и того же мгновения одно и то же число, поэтому запись в базу, ответ API или передача между системами не превращается в спор «московское время или токийское» и «год-месяц-день или день-месяц-год». Датой её рисуют в местном поясе только тогда, когда читать должен человек.
То есть у самой метки временинет часового пояса. Во фразе «перевести метку в московское время» перевод происходит на шаге отображения, а не на шаге хранения. Переключатель часового пояса вверху тоже меняет лишь то, как значения показываются и трактуются: одна и та же метка в обоих поясах — одно и то же мгновение.
Чем 10 цифр отличаются от 13?
10 цифр — сек., 13 цифр — мс, разница ровно в 1000 раз. На практике именно здесь ошибаются чаще всего: в Java System.currentTimeMillis()и в JavaScript Date.now() возвращают миллисекунды (13 цифр), тогда как Unix date +%s, в PHP time()и в MySQL UNIX_TIMESTAMP() возвращают секунды (10 цифр). Прочитайте миллисекунды как секунды — попадёте куда-то за 57000-й год; прочитайте секунды как миллисекунды — окажетесь в первых числах января 1970-го.
Отличить их просто — посчитайте цифры. В нынешнюю эпоху метка в секундах десятизначна, а в миллисекундах — тринадцатизначна, и в обозримом будущем это не изменится. Страница определяет единицу по количеству цифр и показывает своё решение; если ваши данные действительно в другой единице, достаточно поправить ввод. Изредка встречаются 16 цифр (микросекунды) и 19 цифр (наносекунды) — в основном в высокоточных интерфейсах Go и Python и в системах трассировки запросов; их страница тоже узнаёт.
Почему отсчёт идёт с 1970 года?
Эта точка отсчёта называется Epochи происходит из ранних реализаций Unix. Ничего особенного в 1970 году нет: тот, кто задавал стандарт, просто взял недавно прошедший круглый год — так 32-битными целыми того времени удобно накрывалось несколько десятилетий в обе стороны. По мере распространения Unix эту договорённость унаследовали C, Java, JavaScript, всевозможные базы данных и почти все сетевые протоколы.
Наибольшее число секунд, помещающееся в 32-битное знаковое целое, соответствует дате 19 января 2038 года, а дальше происходит переполнение в отрицательное число — это и есть «проблема 2038 года». Современные системы давно перешли на 64-битное хранение и этого потолка не имеют, но старые устройства, старые прошивки и протоколы, где 32-битное поле когда-то прибили гвоздями, попасться всё ещё могут. С другого конца отрицательные метки обозначают моменты до 1970 года — они совершенно законны, и страница их поддерживает.
Как получить метку времени в разных языках
В командной строке date +%s даёт секунды, аdate +%s%3N — миллисекунды (Linux; в macOS date не поддерживает %N, так что поставьте coreutils и берите gdate). В JavaScript это Date.now()(миллисекунды) и Math.floor(Date.now()/1000)(секунды). В Python — time.time(), он возвращает секунды с плавающей точкой. В Java — System.currentTimeMillis(). В PHP — time().
Со стороны баз данных: в MySQL — UNIX_TIMESTAMP() для чтения и FROM_UNIXTIME(ts) для обратного превращения в дату (учтите, что она рисуется в часовом поясе соединения); в PostgreSQL — EXTRACT(EPOCH FROM now()) и to_timestamp(ts). Это ищут довольно часто, хотя нужна тут одна строчка кода, а не веб-страница, — забирайте и пользуйтесь.