ttools
программированиевремяAPIлогирование

Unix timestamp: что это, зачем нужен и как конвертировать

Разберитесь с временными метками в коде. Научитесь переводить между Unix-временем и читаемым форматом дата-время.

Unix-время — это число секунд с полуночи 1 января 1970 года по UTC. Вы встречаете его в API, базах данных, логах и системных вызовах. Разберёмся, почему это удобно, где легко ошибиться и как быстро переводить метки в человеческий формат.

Что такое Unix timestamp

Unix timestamp (он же POSIX time, Epoch time) — целое число, которое показывает, сколько секунд прошло с момента «нулевой точки» — 00:00:00 UTC 1 января 1970 года. Например, 1704067200 — это полночь 1 января 2024 года по UTC.

Формат появился в первых версиях Unix и стал стандартом де-факто. Независимо от часового пояса сервера или клиента, одна и та же секунда в истории имеет одно и то же число. Это решает массу проблем с синхронизацией.

В большинстве языков программирования Unix-время хранится в 32-битном или 64-битном целом числе. 32-битная версия переполнится 19 января 2038 года в 03:14:07 UTC — проблема «Y2K38», о которой стоит помнить при работе со старым кодом.

Зачем использовать временные метки

Универсальность. Независимо от локали пользователя, часового пояса сервера или формата даты в стране, число остаётся числом. API отдаёт 1704067200, а клиент сам решает, показать это как «1 Jan 2024» или «01.01.2024».

Простая арифметика. Чтобы узнать разницу между двумя моментами времени, достаточно вычесть одно число из другого. Не нужно парсить строки, учитывать переходы на летнее время или високосные секунды.

Компактность. 32 бита вместо строки «2024-01-01T00:00:00Z». В базах данных, очередях сообщений и бинарных протоколах это экономит место и ускоряет сравнения.

Сортировка. Unix-время растёт монотонно (не считая корректировок системных часов). Сортировка по числу — это обычная числовая сортировка, без костылей с парсингом дат.

Типичные ловушки

Секунды vs миллисекунды

JavaScript возвращает время в миллисекундах:

Date.now(); // 1704067200000

Большинство других языков и Unix-утилит работают в секундах:

import time
time.time()  # 1704067200.123

Если передать JavaScript-метку в API, который ждёт секунды, получите дату из 55000-го года. Проверяйте документацию и делите на 1000, где нужно:

const unixSeconds = Math.floor(Date.now() / 1000);

UTC vs локальное время

Unix timestamp всегда отсчитывается от UTC. Но многие забывают об этом при конвертации. Например, в Python:

from datetime import datetime

# Неправильно: интерпретирует как локальное время
dt = datetime.fromtimestamp(1704067200)  # зависит от часового пояса системы

# Правильно: явно указываем UTC
dt = datetime.utcfromtimestamp(1704067200)  # 2024-01-01 00:00:00

В базах данных похожая проблема. PostgreSQL различает timestamp (без часового пояса) и timestamp with time zone. Если храните Unix-метку и конвертируете в timestamp, легко получить сдвиг на несколько часов.

Точность и дробные секунды

Иногда нужна точность выше секунды. Тогда используют дробные числа (1704067200.456) или отдельно храните микросекунды. В Go, например:

import "time"

now := time.Now()
nano := now.UnixNano()  // наносекунды с 1970 года
micro := now.UnixMicro()  // микросекунды

Но будьте осторожны: не все системы и базы данных поддерживают такую точность. SQLite хранит дробные секунды без проблем, а MySQL в старых версиях обрезает всё после запятой.

Как конвертировать между форматами

Из Unix-времени в читаемую дату

JavaScript:

const timestamp = 1704067200;
const date = new Date(timestamp * 1000);
console.log(date.toISOString());  // "2024-01-01T00:00:00.000Z"
console.log(date.toLocaleString('ru-RU', { timeZone: 'Europe/Moscow' }));

Python:

from datetime import datetime, timezone

timestamp = 1704067200
dt = datetime.fromtimestamp(timestamp, tz=timezone.utc)
print(dt.isoformat())  # "2024-01-01T00:00:00+00:00"

PHP:

$timestamp = 1704067200;
$date = new DateTime("@$timestamp");
echo $date->format('Y-m-d H:i:s');  // "2024-01-01 00:00:00"

Из даты в Unix-время

JavaScript:

const date = new Date('2024-01-01T00:00:00Z');
const timestamp = Math.floor(date.getTime() / 1000);  // 1704067200

Python:

from datetime import datetime, timezone

dt = datetime(2024, 1, 1, tzinfo=timezone.utc)
timestamp = int(dt.timestamp())  # 1704067200

PHP:

$date = new DateTime('2024-01-01 00:00:00', new DateTimeZone('UTC'));
$timestamp = $date->getTimestamp();  // 1704067200

Инструменты для быстрой конвертации

Когда нужно быстро проверить метку из лога или API, открывать консоль браузера неудобно. Unix Timestamp Converter переводит число в читаемый формат и обратно за пару кликов. Просто вставьте метку — получите дату с учётом вашего часового пояса или UTC.

Если работаете с JSON-ответами API, где даты приходят в разных форматах, пригодится JSON Formatter — он подсвечивает синтаксис и помогает не потеряться в структуре. А для проверки регулярных выражений при валидации временных меток попробуйте Regex Tester.

Когда Unix-время не подходит

Не используйте Unix timestamp для событий до 1970 года — получите отрицательные числа, с которыми не все системы умеют работать. Для исторических дат (например, в музейных каталогах) лучше ISO 8601 или специализированные библиотеки.

Если нужна точность лучше наносекунды (физические эксперименты, высокочастотная торговля), Unix-время тоже не лучший выбор. Там свои стандарты вроде TAI или GPS-времени.

Для бизнес-логики с правилами «каждый понедельник в 10:00» или «последняя пятница месяца» храните не метку, а описание правила. Иначе придётся каждый раз пересчитывать с учётом часовых поясов и переходов на летнее время.

Инструменты по теме