Понятие Unix-времени

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

Ключевая идея заключается в том, что время хранится не как сложная структура (дата, месяц, год, часы, минуты), а как одно целое число, упрощающее вычисления, сравнения и передачу данных между системами.


Базовая модель отсчёта

Unix-время определяется как:

  • начало отсчёта: 1 января 1970 года, 00:00:00 UTC
  • единица измерения: секунда (в классическом Unix-определении)
  • значение: количество секунд, прошедших с начала эпохи

Таким образом:

  • 0 — момент начала эпохи
  • 1 — 1 секунда после эпохи
  • 60 — 1 минута после эпохи
  • 86 400 — 1 сутки после эпохи

UTC как обязательная система координат времени

Unix-время всегда привязано к UTC (Coordinated Universal Time), что устраняет неоднозначность, связанную с часовыми поясами.

Важное следствие:

  • локальное время не влияет на Unix-значение
  • одинаковый момент времени имеет одно и то же число во всех странах
  • преобразование в локальное время выполняется только на уровне отображения

Это делает Unix-время удобным для распределённых систем, API и баз данных.


Миллисекунды в JavaScript

В JavaScript реализация времени отличается от классического Unix-подхода.

Объект Date и функции стандартной библиотеки используют:

  • миллисекунды вместо секунд

Функция:

Date.now()

возвращает количество миллисекунд с Unix-эпохи.

Пример:

1700000000000

Это означает:

  • не секунды, а миллисекунды
  • значение примерно в 1000 раз больше классического Unix timestamp

Разница между секундами и миллисекундами

Формат Единица Пример
Unix timestamp секунды 1700000000
JavaScript timestamp миллисекунды 1700000000000

Переход между форматами:

const seconds = Math.floor(Date.now() / 1000);
const milliseconds = seconds * 1000;

Историческое происхождение

Unix-время возникло в рамках разработки операционной системы Unix в 1970-х годах.

Причины выбора модели:

  • упрощение арифметики времени
  • единая шкала для всех операций
  • минимизация хранения данных
  • удобство сравнения временных меток

Числовой формат оказался особенно удобным для системного программирования и логирования событий.


Внутреннее представление в системах

Во многих операционных системах Unix-подобного типа время хранится как целое число:

  • 32-битное целое (устаревший формат)
  • 64-битное целое (современный стандарт)

32-битная проблема

32-битное Unix-время ограничено диапазоном:

  • максимум: 19 января 2038 года

Это ограничение известно как проблема Year 2038 (Y2038 problem).

Причина:

  • переполнение знакового 32-битного числа
  • переход значения в отрицательный диапазон

Современные системы используют 64-битное представление, которое практически не имеет ограничений в обозримом будущем.


Отрицательные значения Unix-времени

Unix-время может быть отрицательным:

  • значения до 1 января 1970 года

Пример:

-86400 → 31 декабря 1969 года

Это возможно благодаря тому, что шкала времени симметрична относительно нуля.


Преобразование Unix-времени в дату

Unix-время является промежуточным представлением, которое преобразуется в календарную дату.

В Jav * aScript:

const date = new Date(1700000000000);

Внутренне происходит:

  • интерпретация числа как миллисекунд
  • вычисление календарных компонентов
  • привязка к UTC

Обратное преобразование

Получение Unix-времени из даты:

const timestamp = new Date().getTime();

или

const timestamp = Date.now();

Для секундного формата:

const unixSeconds = Math.floor(Date.now() / 1000);

Особенности округления

При переходе между форматами важно учитывать округление:

  • Math.floor — стандарт для Unix timestamp в секундах
  • Math.round может исказить момент времени
  • дробные значения в секундах не используются в классическом Unix

Проблема точности

Несмотря на простоту, Unix-время имеет ограничения:

  • не хранит информацию о календарной системе
  • не учитывает високосные секунды напрямую
  • зависит от системных часов

В некоторых системах добавляются leap seconds, но Unix-время обычно их игнорирует, обеспечивая непрерывность шкалы.


Високосные секунды и их влияние

Високосные секунды вводятся для корректировки вращения Земли относительно атомного времени.

Однако:

  • Unix-время не увеличивается на leap second
  • фактическое время UTC может иметь корректировки
  • возникает небольшое расхождение между UTC и Unix-таймлайном

Это сделано ради:

  • простоты вычислений
  • монотонности временной шкалы
  • отсутствия “скачков” времени в системах

Сравнение с календарным временем

Календарное время:

  • год, месяц, день, часы
  • зависит от локальных правил
  • сложно сравнивать напрямую

Unix-время:

  • одно число
  • легко сравнивать
  • удобно сортировать

Пример сравнения:

const a = 1700000000000;
const b = 1700000100000;

const isEarlier = a < b;

Использование в вычислениях

Unix-время активно используется для:

  • измерения интервалов
  • логирования событий
  • синхронизации серверов
  • кэширования
  • проверки актуальности данных

Пример вычисления разницы:

const start = Date.now();

// операция
for (let i = 0; i < 1e6; i++) {}

const end = Date.now();

const duration = end - start;

Результат выражается в миллисекундах.


Преобразование в читаемые форматы

Unix-время редко используется напрямую для отображения пользователю. Обычно оно преобразуется в формат даты.

В контексте библиотек работы с датами, таких как date-fns, Unix-время служит базовым входным или промежуточным типом данных, на основе которого выполняются операции форматирования, сравнения и арифметики.


Пограничные значения и диапазоны

64-битное Unix-время позволяет хранить:

  • очень большие положительные значения (далёкое будущее)
  • очень большие отрицательные значения (далёкое прошлое)

Практический диапазон превышает возраст Вселенной в несколько раз при измерении в миллисекундах.


Влияние системного времени

Unix-время зависит от системных часов устройства:

  • ручное изменение времени влияет на значение
  • синхронизация через NTP корректирует смещения
  • виртуальные среды могут иметь собственные источники времени

Поэтому в распределённых системах часто используется сервер как источник истины.


Форматирование и хранение в API

Во многих API Unix-время используется как стандарт:

  • параметры запросов
  • временные метки событий
  • токены с истечением срока действия

Пример:

expires_at: 1700000000

или

created_at: 1700000000000

Интервал времени как разница Unix-значений

Одно из ключевых свойств:

  • разница двух Unix-значений даёт длительность
const duration = endTimestamp - startTimestamp;

Это работает без дополнительных преобразований, поскольку шкала линейна.


Практическая значимость линейной шкалы

Линейность Unix-времени обеспечивает:

  • отсутствие сложной логики календаря при вычислениях
  • простоту сортировки событий
  • независимость от локальных настроек
  • стабильность в распределённых системах

Эта модель делает возможным эффективное управление временем в программных системах любого масштаба.