Unix-метка времени: объяснение

Что такое Unix-время

Unix-время (также называемое POSIX-временем или временем Epoch) — это единое целое число, представляющее количество секунд, прошедших с 00:00:00 UTC в четверг, 1 января 1970 года — точки отсчёта, известной как эпоха Unix. Например, метка времени 1700000000 соответствует 14 ноября 2023 года, 22:13:20 UTC.

Почему именно 1970 год

Unix-подобные операционные системы разрабатывались в конце 1960-х — начале 1970-х годов. Год 1970 был выбран как удобная круглая отправная точка, близкая к моменту появления самого Unix. Особого астрономического или политического значения у неё не было — это был просто практичный выбор.

Ключевые свойства

  • Всегда UTC: Unix-метки времени не зависят от часового пояса. Они всегда относятся к UTC, независимо от того, где находится сервер или клиент.
  • Целое или дробное число: целые секунды представлены обычным целым числом. Точность до долей секунды использует число с плавающей точкой (например, 1700000000.456).
  • Варианты в миллисекундах: Date.now() в JavaScript возвращает миллисекунды от начала эпохи, а не секунды — всегда проверяйте единицы измерения.
  • Не учитывает високосные секунды: шкала времени Unix игнорирует високосные секунды, из-за чего может немного расходиться с реальным UTC вблизи моментов добавления високосной секунды.

Получение текущей метки времени

Практически каждый язык программирования предоставляет встроенный способ получить текущую Unix-метку времени:

# Python
import time
print(int(time.time()))          # e.g. 1700000000

# JavaScript
console.log(Date.now())          // milliseconds — divide by 1000 for seconds
console.log(Math.floor(Date.now() / 1000))

# Bash
date +%s

# SQL (PostgreSQL)
SELECT EXTRACT(EPOCH FROM NOW())::BIGINT;

Преобразование метки времени в удобочитаемую дату

# Python
from datetime import datetime, timezone
dt = datetime.fromtimestamp(1700000000, tz=timezone.utc)
print(dt.isoformat())   # 2023-11-14T22:13:20+00:00

# JavaScript
new Date(1700000000 * 1000).toISOString()
// "2023-11-14T22:13:20.000Z"

Типичные ошибки

  • Миллисекунды и секунды: всегда уточняйте, возвращает ли API миллисекунды или секунды. Ненужное деление на 1000 даёт даты в 1970 году.
  • Переполнение 32-битного значения: в системах, использующих знаковое 32-битное целое, метки времени переполнятся в 2038 году. См. руководство о проблеме 2038 года.
  • Отрицательные метки времени: даты до 1970 года представляются отрицательными числами, которые корректно обрабатываются большинством современных языков.

Когда использовать Unix-время

Unix-метки времени идеально подходят для хранения и сравнения дат в базах данных, API и журналах. Они компактны, легко сортируются, не зависят от часового пояса и однозначны. Для показа пользователям всегда преобразуйте их в локальную дату и время с корректной обработкой часового пояса.