Все статьи
Числа и сеть

Unix timestamp: конвертация времени

Что такое Unix timestamp, конвертация в дату, часовые пояса, использование в программировании.

7 апреля 2025
7 мин чтения
ConvertHub
#timestamp#unix#время

Введение

Время в компьютерных системах — понятие сложное. Люди привыкли к часам, минутам, дням недели, часовым поясам и календарям. Машины же предпочитают работать с одним числом, которое однозначно указывает момент времени. Этим числом и служит 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.Ticks100-наносекундные интервалы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 и в локальном времени и работает прямо в браузере.

Попробуйте эти инструменты

Похожие статьи