🕐
← Назад к руководствам

Что такое Unix-время? Полное руководство

· Теги: unix-timestamp, epoch, linux-time, 2038-problem, utc, time-conversion

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

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

В отличие от привычных человеку форматов дат, которые зависят от часового пояса («19 июля 2026 г., 15:30 EST»), Unix-время представляет собой одно целое число, обозначающее один и тот же момент в любой точке Земли. Например, метка времени 1785292800 соответствует конкретному моменту независимо от того, находитесь ли вы в Нью-Йорке, Лондоне или Токио.

Unix-время лежит в основе обработки времени в современных вычислениях. Операционные системы, языки программирования, базы данных и файловые системы — все они полагаются на это простое целочисленное представление «под капотом».

Эпоха Unix: почему именно 1 января 1970 года?

Выбор 1 января 1970 года в качестве «эпохи» (начальной точки отсчёта) не был случайным. К этому решению привели несколько практических соображений:

  • Ранняя разработка Unix: Операционная система Unix разрабатывалась в Bell Labs в конце 1960-х — начале 1970-х годов. К тому времени, когда система времени была стандартизирована в начале 1970-х, 1 января 1970 года было удобной, недавней точкой отсчёта.
  • Простота: Время в ранних системах Unix хранилось как 32-битное знаковое целое число, отсчитывающее секунды. Использование недавней даты максимизировало представимый диапазон в будущее.
  • Прецедент: Эпоха была закреплена в первом стандарте POSIX, что сделало её универсальной точкой отсчёта для всех Unix-подобных систем.

Более ранние Unix-подобные системы использовали другие эпохальные даты, но эпоха 1970 года стала стандартом для всех POSIX-совместимых систем навсегда.

Как работает значение метки времени

Основная идея проста:

  • Значение 0 означает ровно 1 января 1970 года, 00:00:00 UTC
  • Значение 86400 (60 × 60 × 24) означает 2 января 1970 года, 00:00:00 UTC
  • Значение -3600 означает 31 декабря 1969 года, 23:00:00 UTC (отрицательные значения представляют даты до эпохи)

Формула проста:

timestamp = seconds since 1970-01-01 00:00:00 UTC

Миллисекундные метки времени

Многие современные системы, особенно JavaScript и веб-API, используют миллисекунды вместо секунд. Миллисекундная метка времени — это просто значение в секундах, умноженное на 1000:

  • Date.now() в JavaScript возвращает миллисекунды
  • time.time() в Python возвращает секунды как число с плавающей точкой с долями миллисекунд

Всегда проверяйте, какое разрешение использует система, перед преобразованием, так как их смешивание может привести к ошибкам в датах на десятилетия.

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

Проблема 2038 года (также называемая «Unix-ошибкой тысячелетия» или «Y2K38») — это проблема представления времени, которая затронет системы, хранящие метки времени как 32-битные знаковые целые числа.

32-битное знаковое целое может хранить значения примерно от -2,1 миллиарда до +2,1 миллиарда. Максимальное представимое значение Unix-времени — 2147483647, что соответствует:

  • 19 января 2038 года, 03:14:07 UTC

Одну секунду спустя значение переполнится до -2147483648, что соответствует 13 декабря 1901 года — в результате системы будут интерпретировать текущее время как дату из начала XX века.

Какие системы затронуты?

  • Встроенные устройства и IoT-оборудование с 32-битными процессорами
  • Старые встроенные ядра Linux
  • Устаревшие базы данных, использующие 32-битные целочисленные столбцы для времени
  • Файловые системы и бинарные форматы, хранящие время как 32-битные целые числа

Решение

Современные системы в основном перешли на 64-битные целые числа для хранения времени. 64-битное знаковое целое может представлять время примерно на 292 миллиарда лет в будущее — фактически бесконечно для любых практических целей.

  • Большинство современных дистрибутивов Linux на 64-битном оборудовании уже в безопасности
  • Ядро Linux использует 64-битный time_t на 64-битных системах уже много лет
  • Ядро 5.6+ ввело поддержку 64-битного time_t для 32-битных архитектур
  • Языки программирования, такие как Python, Go и Java, используют 64-битные целые внутри

Если вы обслуживаете встроенные системы или устаревшее программное обеспечение, проверка размера вашего time_t — полезное упражнение уже сегодня.

UTC и связь с Unix-временем

Unix-время по своей природе не зависит от часового пояса — оно всегда относится к UTC.

Что такое UTC?

Всемирное координированное время (UTC) — это основной стандарт времени, по которому мир регулирует часы и время. Он заменил среднее время по Гринвичу (GMT) в качестве международного стандарта и поддерживается атомными часами.

Почему UTC важен для Unix-времени

  • Unix-время определено в UTC, поэтому метка времени представляет один и тот же момент глобально
  • Преобразование Unix-времени в местное время — это чисто задача уровня отображения
  • В самой метке времени не хранится информация о часовом поясе, что делает систему простой и переносимой

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

Високосные секунды: редкое исключение

Теоретически Unix-время отсчитывает секунды с эпохи, но оно игнорирует високосные секунды. День с добавленной високосной секундой по-прежнему имеет ровно 86400 секунд в Unix-времени. Это означает, что во время високосной секунды Unix-время не продвигается, и високосная секунда фактически исчезает из подсчёта.

Это упрощение делает систему практичной, но означает, что Unix-время немного расходится с атомным временем. Расхождение настолько мало, что редко имеет значение для повседневных приложений.

Распространённые диапазоны меток времени

| Метка времени | Человекочитаемая дата | Значение | |-----------|---------------------|--------------| | 0 | 1970-01-01 00:00:00 UTC | Эпоха Unix | | 86400 | 1970-01-02 00:00:00 UTC | Один день после эпохи | | 946684800 | 2000-01-01 00:00:00 UTC | 2000 год | | 1234567890 | 2009-02-13 23:31:30 UTC | Запоминающийся шаблон | | 1785292800 | 2026-07-19 00:00:00 UTC | Сегодняшняя эпоха | | 2147483647 | 2038-01-19 03:14:07 UTC | 32-битный максимум |

Итоги

Unix-время — это элегантный, переносимый способ представления времени в виде одного целого числа. Его устройство — подсчёт секунд от 1 января 1970 года UTC — делает его универсальным стандартом времени в операционных системах, базах данных и языках программирования. Хотя проблема 2038 года угрожает устаревшим системам, продолжающийся переход на 64-битное время гарантирует, что Unix-время останется основой компьютерного времяисчисления на многие поколения вперёд.

Готовы работать с Unix-временем? Воспользуйтесь нашим Конвертером Unix-времени, чтобы мгновенно преобразовывать метки времени в человекочитаемые даты и обратно.