Открыть сервис

Unix timestamp

Unix timestamp (также Unix-время, POSIX-время, Epoch time) — это система отсчёта времени, широко используемая в вычислительной технике и информатике, представляющая собой количество секунд, прошедших с начала эпохи Unix — 1 января 1970 года 00:00:00 UTC (всемирное координированное время). Значение Unix timestamp не зависит от часового пояса и служит универсальным способом представления момента времени в виде целого или дробного числа.

История

Предпосылки создания

В 1960-х годах, при разработке операционной системы Unix в Bell Labs (подразделение AT&T), возникла необходимость в компактном и машинно-независимом формате хранения времени. Ранние версии Unix использовали 32-битное целое число для хранения времени в 60-герцовых тиках (1/60 секунды) с 1 января 1971 года. Однако этот подход был неудобен для межплатформенной совместимости.

Стандартизация

В 1970 году Кен Томпсон и Деннис Ритчи, создатели Unix, выбрали 1 января 1970 года 00:00:00 UTC в качестве начала эпохи. Выбор был обусловлен простотой вычислений: 1970 год был близок к моменту разработки, а UTC — универсальный эталон, не зависящий от местных часовых поясов. В 1988 году система была стандартизирована в спецификации POSIX (IEEE 1003.1), которая закрепила определение Unix timestamp как количество секунд с начала эпохи, исключая високосные секунды.

Проблема 2038 года

Поскольку традиционные 32-битные системы хранят Unix timestamp как знаковое целое число, максимальное значение, которое может быть представлено, — 2 147 483 647 секунд, что соответствует 19 января 2038 года 03:14:07 UTC. После этого момента значение переполнится и станет отрицательным, что может привести к сбоям в программном обеспечении, аналогичным «проблеме 2000 года». Для решения этой проблемы современные системы переходят на 64-битные типы данных, которые обеспечивают представление времени на миллиарды лет вперёд.

Технические характеристики

Определение и единицы измерения

Unix timestamp измеряется в секундах, прошедших с 1 января 1970 года 00:00:00 UTC. Високосные секунды игнорируются — каждая секунда считается равной 1/86400 средних солнечных суток. Это означает, что Unix timestamp не синхронизирован с астрономическим временем, но обеспечивает равномерное и предсказуемое приращение.

Форматы представления

  • Целочисленный (integer): наиболее распространённый формат, хранящийся как 32-битное (до 2038 года) или 64-битное знаковое целое число. Пример: 1 704 000 000 (соответствует 1 января 2024 года 00:00:00 UTC).
  • Дробный (float): используется для более точного представления, включая миллисекунды, микросекунды или наносекунды. Например, 1 704 000 000.123.
  • Строковый (string): в некоторых системах timestamp может быть представлен в виде строки, например, «1704000000».

Связь с UTC

Unix timestamp не содержит информации о часовом поясе. Для преобразования в локальное время используется смещение относительно UTC. Например, timestamp 1 704 000 000 соответствует 1 января 2024 года 03:00:00 по московскому времени (UTC+3).

Применение

В операционных системах

Unix timestamp является основным форматом хранения времени в ядре Linux, macOS, BSD и других Unix-подобных системах. Системные вызовы, такие как time(), gettimeofday() и clock_gettime(), возвращают значение timestamp. Файловые системы (например, ext4, NTFS) хранят метки времени (время создания, модификации, доступа) в формате timestamp.

В программировании

Большинство языков программирования имеют встроенные функции для работы с Unix timestamp:

  • Python: модуль time (функции time.time(), time.gmtime(), time.localtime()).
  • JavaScript: Date.now() возвращает timestamp в миллисекундах, Math.floor(Date.now() / 1000) — в секундах.
  • PHP: функция time().
  • Java: System.currentTimeMillis().
  • C/C++: time_t тип данных и функция time().

В базах данных

Многие системы управления базами данных (СУБД) используют Unix timestamp для хранения дат и времени. Например, в MySQL тип TIMESTAMP хранит значение в формате timestamp, а в PostgreSQL — тип TIMESTAMP WITH TIME ZONE может быть преобразован в timestamp. Это упрощает сортировку, фильтрацию и вычисления разницы между датами.

В веб-технологиях

  • HTTP-заголовки: заголовок Date передаётся в формате HTTP-date, но внутренние вычисления часто основаны на timestamp.
  • API и JSON: многие REST API возвращают даты в виде timestamp (например, в JSON-формате: "created_at": 1704000000).
  • Куки и сессии: срок действия кук часто задаётся в виде timestamp.

В криптовалютах и блокчейне

Блокчейн-сети, такие как Bitcoin и Ethereum, используют Unix timestamp для отметки времени создания блоков. Это позволяет верифицировать последовательность транзакций и предотвращать атаки повторного воспроизведения.

Преимущества и недостатки

Преимущества

  • Универсальность: timestamp не зависит от часового пояса, что упрощает обмен данными между системами в разных регионах.
  • Компактность: 32-битное число занимает всего 4 байта, что экономит память и дисковое пространство.
  • Простота вычислений: арифметические операции (сложение, вычитание) над timestamp позволяют легко вычислять разницу между моментами времени.
  • Машинная эффективность: целочисленные операции выполняются быстрее, чем операции с датами в текстовом формате.

Недостатки

  • Проблема 2038 года: 32-битные системы могут столкнуться с переполнением.
  • Игнорирование високосных секунд: при точных астрономических или научных расчётах может потребоваться учёт високосных секунд.
  • Неудобство для человека: timestamp нечитаем для человека без преобразования в календарную дату.

Альтернативы

ISO 8601

Стандарт ISO 8601 представляет дату и время в текстовом формате, например, «2024-01-01T00:00:00Z». Он удобен для чтения человеком, но занимает больше места и требует парсинга.

TAI (Международное атомное время)

В некоторых научных и технических приложениях используется TAI, который включает високосные секунды. Однако TAI не синхронизирован с гражданским временем (UTC), что затрудняет его использование в повседневных задачах.

NTP timestamp

Протокол NTP (Network Time Protocol) использует 64-битный timestamp, разделённый на секунды и дробную часть, что обеспечивает высокую точность (до 2⁻³² секунды). NTP timestamp также отсчитывается от 1 января 1900 года.

Интересные факты

  • Точка отсчёта Unix timestamp (1 января 1970 года) была выбрана произвольно, но с тех пор стала де-факто стандартом для компьютерных систем.
  • В некоторых системах (например, в macOS) timestamp может быть отрицательным для дат до 1970 года, что позволяет представлять исторические даты.
  • Проблема 2038 года уже частично решена: большинство современных 64-битных систем (Linux, macOS, Windows) используют 64-битный time_t, что обеспечивает работоспособность до 292 миллиардов лет в будущем.

Источники

  • IEEE Std 1003.1-2017 (POSIX.1-2017) — стандарт, определяющий Unix timestamp.
  • Керниган Б., Пайк Р. «Unix. Программное окружение» — описание системы времени в ранних версиях Unix.
  • Tanenbaum A. S. «Modern Operating Systems» — раздел об управлении временем в операционных системах.
  • RFC 868 (Time Protocol) и RFC 1305 (NTP) — протоколы синхронизации времени, использующие timestamp.
  • Документация GNU C Library — раздел «Time Types» и «Calendar Time».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →