Unix Timestamp: конвертация дат и времени
Что такое Unix Timestamp
Unix timestamp (Unix time, POSIX time, Epoch time) — это способ представления момента времени в виде одного числа: количества секунд, прошедших с 1 января 1970 года 00:00:00 UTC. Эта начальная точка называется «эпохой Unix» (Unix Epoch). Например, timestamp 1700000000 соответствует 14 ноября 2023 года, 22:13:20 UTC.
Unix timestamp — это универсальный способ хранения времени, не зависящий от часовых поясов, форматов дат или локалей. Именно поэтому он стал стандартом в программировании, базах данных и API.
Почему отсчёт с 1970 года
Выбор 1 января 1970 года как начальной точки — исторический. Операционная система Unix была разработана в конце 1960-х, и 1970 год был выбран как удобная круглая дата, близкая к моменту создания системы. Первые реализации хранили время как 32-битное знаковое целое число, что позволяло представлять даты с 13 декабря 1901 года по 19 января 2038 года.
Форматы Unix timestamp
В зависимости от контекста timestamp может измеряться в разных единицах:
- Секунды — классический Unix timestamp. 10 цифр для текущего времени (например,
1700000000). - Миллисекунды — используется в JavaScript (
Date.now()), Java (System.currentTimeMillis()). 13 цифр (например,1700000000000). - Микросекунды — используется в некоторых базах данных и высокоточных системах. 16 цифр.
- Наносекунды — используется в Go (
time.Now().UnixNano()). 19 цифр.
Важно: при работе с API всегда уточняйте, в каких единицах ожидается timestamp. Путаница между секундами и миллисекундами — распространённая ошибка, приводящая к датам в 1970 году или далёком будущем.
Проблема 2038 года (Y2K38)
32-битное знаковое целое число может хранить значения от -2,147,483,648 до 2,147,483,647. Максимальное значение соответствует 19 января 2038 года, 03:14:07 UTC. После этого момента 32-битный timestamp «переполнится» и станет отрицательным — время откатится в 1901 год.
Эта проблема аналогична знаменитому «багу 2000 года» (Y2K), но потенциально серьёзнее, так как затрагивает множество встраиваемых систем, баз данных и legacy-кода. Решение — переход на 64-битный timestamp, который хватит на 292 миллиарда лет. Большинство современных систем уже используют 64-битное представление, но старые устройства (IoT, промышленные контроллеры) могут быть уязвимы.
Конвертация на практике
JavaScript
JavaScript работает с миллисекундами:
- Текущий timestamp:
Math.floor(Date.now() / 1000)(в секундах). - Дата в timestamp:
Math.floor(new Date('2024-01-15').getTime() / 1000). - Timestamp в дату:
new Date(1700000000 * 1000).toISOString().
Python
- Текущий timestamp:
import time; int(time.time()). - Дата в timestamp:
import datetime; int(datetime.datetime(2024, 1, 15).timestamp()). - Timestamp в дату:
datetime.datetime.fromtimestamp(1700000000).
PHP
- Текущий timestamp:
time(). - Дата в timestamp:
strtotime('2024-01-15'). - Timestamp в дату:
date('Y-m-d H:i:s', 1700000000).
SQL
- MySQL:
UNIX_TIMESTAMP()иFROM_UNIXTIME(1700000000). - PostgreSQL:
EXTRACT(EPOCH FROM NOW())иTO_TIMESTAMP(1700000000).
Unix timestamp и часовые пояса
Unix timestamp всегда хранится в UTC. Это его главное преимущество: одно и то же число однозначно определяет момент времени вне зависимости от часового пояса. Конвертация в локальное время происходит при отображении пользователю.
Частая ошибка: создание timestamp из локального времени без указания часового пояса. Функция strtotime('2024-01-15 12:00:00') в PHP будет использовать серверный часовой пояс, что может привести к разным результатам на разных серверах. Всегда указывайте часовой пояс явно или работайте с UTC.
Unix timestamp в API
При проектировании API у вас есть два основных формата для передачи дат:
- Unix timestamp — компактный, легко сравнивать и сортировать, не зависит от формата. Но менее читаем для человека.
- ISO 8601 (
2024-01-15T12:00:00Z) — читаем, включает информацию о часовом поясе. Стандарт для REST API.
Многие API поддерживают оба формата. При работе с данными, содержащими timestamps, удобно использовать наш JSON форматтер для визуализации структуры ответа.
Интересные даты в Unix time
0— 1 января 1970, 00:00:00 UTC — Unix Epoch.1000000000— 9 сентября 2001, 01:46:40 UTC — «гигасекунда».2000000000— 18 мая 2033, 03:33:20 UTC — ждём!2147483647— 19 января 2038, 03:14:07 UTC — предел 32-битного timestamp.
Часто задаваемые вопросы
Может ли Unix timestamp быть отрицательным?
Да, отрицательные значения представляют даты до 1 января 1970 года. Например, -86400 — это 31 декабря 1969 года. Большинство современных систем корректно обрабатывают отрицательные timestamp, но некоторые старые реализации — нет.
Учитывает ли Unix timestamp високосные секунды?
Нет. Unix time не учитывает високосные секунды (leap seconds) — он считает, что в каждом дне ровно 86400 секунд. При добавлении високосной секунды Unix timestamp «замораживается» или повторяется. Для большинства приложений это несущественно, но критично для высокоточных систем (GPS, научные вычисления).
Как конвертировать Unix timestamp в дату онлайн?
Откройте наш конвертер Unix timestamp, введите число — и получите дату в удобном формате. Или введите дату — и получите соответствующий timestamp. Инструмент поддерживает секунды и миллисекунды и показывает результат в вашем локальном часовом поясе.
Почему Unix timestamp так популярен в программировании?
Одно число вместо сложной структуры даты. Нет проблем с часовыми поясами (всегда UTC). Легко сравнивать (if timestamp_a > timestamp_b), сортировать и выполнять арифметику (разница двух timestamp — интервал в секундах). Компактно хранится в базе данных (4 или 8 байт). Поддерживается всеми языками и платформами.