Unix timestamp: конвертация времени
Что такое Unix timestamp, конвертация в дату, часовые пояса, использование в программировании.
Введение
Время в компьютерных системах — понятие сложное. Люди привыкли к часам, минутам, дням недели, часовым поясам и календарям. Машины же предпочитают работать с одним числом, которое однозначно указывает момент времени. Этим числом и служит Unix timestamp — количество секунд, прошедших с 1 января 1970 года по UTC. Сегодня это самый распространённый способ хранения времени в базах данных, логах, API и протоколах.
В этой статье мы разберём, что такое Unix-время, как оно устроено, как конвертировать timestamp в человекочитаемую дату и обратно, какие проблемы с ним связаны (часовые пояса, високосные секунды, 2038 год) и какие функции работы со временем предлагают популярные языки программирования.
Что такое Unix timestamp
Unix timestamp (также Unix epoch time, POSIX time) — это количество секунд, прошедших с полуночи 1 января 1970 года по координированному всемирному времени (UTC), без учёта високосных секунд. Эта дата называется «эпохой Unix» и была выбрана разработчиками операционной системы Unix как удобная точка отсчёта.
Эпоха Unix: 1970-01-01 00:00:00 UTC
Примеры:
0 → 1970-01-01 00:00:00 UTC
100000000 → 1973-03-03 09:46:40 UTC
1000000000 → 2001-09-09 01:46:40 UTC
1609459200 → 2021-01-01 00:00:00 UTC
1700000000 → 2023-11-14 22:13:20 UTCВ современных системах timestamp обычно хранится как 64-битное целое со знаком, что покрывает временной диапазон примерно от 292 миллиардов лет назад до 292 миллиардов лет вперёд. В 32-битных системах используется знаковое 32-битное целое, и максимальное значение — 2 147 483 647, что соответствует 19 января 2038 года (так называемая проблема Y2038).
Почему именно 1970 год
Unix была разработана в конце 1960-х — начале 1970-х годов в Bell Labs. Выбор 1 января 1970 года как эпохи был прагматичным: это была ближайшая круглая дата, удобная для разработчиков. Вариант с 32-битным счётчиком секунд был достаточен для того времени и обеспечивал диапазон около 68 лет в каждую сторону от эпохи.
Сегодня этот выбор кажется произвольным, но он уже укоренился в огромном количестве систем. Поэтому даже новые API, такие как JavaScript Date.now() или Python time.time(), возвращают время относительно той же эпохи.
Конвертация timestamp в дату
JavaScript / TypeScript
В JavaScript время измеряется в миллисекундах с эпохи Unix, поэтому timestamp в секундах нужно умножить на 1000:
const ts = 1700000000; // секунды
const date = new Date(ts * 1000);
date.toISOString(); // "2023-11-14T22:13:20.000Z"
date.toLocaleString('ru-RU'); // локальное время в русском формате
// Текущее время в миллисекундах
Date.now(); // 1700000000000
// Текущее время в секундах
Math.floor(Date.now() / 1000);Python
import time
from datetime import datetime, timezone
# Текущий timestamp
ts = time.time() # float, секунды с дробной частью
# Timestamp → datetime
dt = datetime.fromtimestamp(1700000000, tz=timezone.utc)
print(dt.isoformat()) # 2023-11-14T22:13:20+00:00
# Локальное время
local = datetime.fromtimestamp(1700000000)
print(local) # зависит от часового пояса системы
# datetime → timestamp
ts2 = datetime(2024, 1, 1, tzinfo=timezone.utc).timestamp()Командная строка (Linux/macOS)
# Текущий timestamp
date +%s
# Timestamp → дата
date -d @1700000000 # Linux
date -r 1700000000 # macOS
# Дата → timestamp
date -d "2024-01-01 00:00:00 UTC" +%sДля удобного преобразования без установки утилит используйте нашконвертер Unix timestamp — он работает в браузере и поддерживает оба направления перевода.
Часовые пояса и UTC
Timestamp не зависит от часового пояса: это абсолютное значение, отсчитанное от UTC. Поясное преобразование выполняется только при отображении времени пользователю. Например, значение1700000000 соответствует:
- UTC: 2023-11-14 22:13:20
- Москва (UTC+3): 2023-11-15 01:13:20
- Нью-Йорк (UTC−5): 2023-11-14 17:13:20
- Токио (UTC+9): 2023-11-15 07:13:20
Хранить время в виде timestamp — лучшая практика для backend-приложений. На фронтенде timestamp преобразуется в локальное время браузера. Это избавляет от проблем с переходом на летнее время и сменой часовых поясов на серверах.
Единицы измерения: секунды, миллисекунды, микросекунды
Разные языки и API используют разные единицы измерения timestamp. Это частая причина ошибок при интеграции систем.
| Язык / API | Единица | Пример значения |
|---|---|---|
| Unix-время (canonical) | секунды | 1700000000 |
| JavaScript Date | миллисекунды | 1700000000000 |
| Java Instant | секунды + наносекунды | 1700000000s + 0ns |
| Python time.time() | секунды (float) | 1700000000.123 |
| C# DateTime.Ticks | 100-наносекундные интервалы | 638338640000000000 |
| PostgreSQL | микросекунды | 1700000000000000 |
Перед передачей timestamp между системами всегда уточняйте единицы измерения. Распространённая ошибка — передать миллисекунды в API, который ожидает секунды; в результате дата уходит в далёкое будущее (примерно в 56 000-й год нашей эры).
Високосные секунды и точность
Стандартный Unix-время не учитывает високосные секунды — корректировки, которые вводятся Международной службой вращения Земли для компенсации замедления вращения планеты. Когда вводится високосная секунда, в обычных часах происходит «перепрыгивание» 23:59:60, а Unix-таймстамп либо повторяет значение, либо игнорирует эту секунду — в зависимости от реализации.
Для большинства прикладных задач это не критично, но в высокоточных системах (финансы, телеком, научные расчёты) могут возникать расхождения. В таких случаях применяют специальные библиотеки, учитывающие leap seconds, или переходят на TAI (International Atomic Time).
Проблема 2038 года (Y2038)
В системах, где timestamp хранится в знаковом 32-битном целом, максимальное значение2 147 483 647 соответствует 19 января 2038 года, 03:14:07 UTC. В следующую секунду счётчик переполнится и примет отрицательное значение, что будет интерпретировано как дата в 1901 году.
Для большинства современных систем эта проблема уже решена переходом на 64-битные типы данных. Однако уязвимыми остаются embedded-устройства, старое оборудование и legacy-код. Особо опасны ситуации, когда данные из новой системы попадают в старую: timestamp за пределами 32-битного диапазона вызывает ошибку или приводится к некорректному значению.
Практические сценарии использования
Хранение времени в базе данных
Timestamp удобен для хранения времени создания и обновления записей. Большинство СУБД поддерживают специальный тип TIMESTAMP, но часто проще хранить целое число — это упрощает сравнения и индексацию.
-- SQL: фильтр по времени создания
SELECT * FROM orders
WHERE created_at > 1700000000
ORDER BY created_at DESC
LIMIT 50;API и кэширование
В REST API timestamp используют для передачи времени в заголовках If-Modified-Since иLast-Modified, а также для управления кэшем через Cache-Control иExpires.
Логи и метрики
В лог-файлах timestamp — это базовое поле, по которому выполняется сортировка и фильтрация. Системы мониторинга (Prometheus, Grafana, ELK) хранят метрики с привязкой к Unix-времени, что упрощает агрегацию и построение графиков.
Токены с истечением срока
JWT-токены, сессии, временные ссылки содержат поле exp — expiration time в виде timestamp. Сервер сравнивает это значение с текущим timestamp для проверки действительности токена.
Форматирование даты под локаль
Несмотря на удобство timestamp для хранения, при выводе пользователю время нужно форматировать с учётом локали: в России принято «день.месяц.год», в США — «месяц/день/год», в ISO 8601 — «год-месяц-день». Современные API Intl.DateTimeFormat в JavaScript и strftime в Python решают эту задачу.
// JavaScript — форматирование под локаль
const ts = 1700000000;
const date = new Date(ts * 1000);
new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'long',
timeStyle: 'short',
timeZone: 'Europe/Moscow',
}).format(date);
// "15 ноября 2023 г., 01:13"
new Intl.DateTimeFormat('en-US', {
dateStyle: 'medium',
}).format(date);
// "Nov 14, 2023"
// Python — форматирование через strftime
from datetime import datetime, timezone, timedelta
moscow = timezone(timedelta(hours=3))
dt = datetime.fromtimestamp(1700000000, tz=moscow)
print(dt.strftime('%d.%m.%Y %H:%M')) # 15.11.2023 01:13Использование стандарта ISO 8601 (YYYY-MM-DDTHH:MM:SSZ) для обмена данными между системами — лучшая практика. Этот формат однозначен, легко парсится и не зависит от локали. Подробный разбор форматов времени и преобразования между ними — в нашемконвертере Unix timestamp.
Заключение
Unix timestamp — это простой, надёжный и универсальный способ работы со временем в программировании. Он избавляет от проблем с часовыми поясами и форматами записи, легко сравнивается и хранится. Главное — помнить про единицы измерения (секунды или миллисекунды) и про часовой пояс при отображении пользователю.
Чтобы быстро перевести timestamp в человекочитаемую дату или получить текущее Unix-время, используйте наш конвертер Unix timestamp — он поддерживает секунды и миллисекунды, показывает результат в UTC и в локальном времени и работает прямо в браузере.
Попробуйте эти инструменты
Похожие статьи
Системы счисления: двоичная, восьмеричная, шестнадцатеричная
Позиционные системы счисления, конвертация между ними, использование в программировании.
Двоичная в десятичную: как конвертировать
Алгоритм перевода binary to decimal, степени двойки, примеры, использование в программировании.
Римские цифры: таблица и правила записи
Римская система счисления, символы, правила, запись больших чисел, история и современное использование.
Калькулятор процентов: как считать проценты
Виды расчёта процентов: от числа, процентное изменение, скидки, налоги, примеры.