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 →