Tools Blog

Что такое время эпохи Unix? Руководство разработчика по временным меткам

Unix Epoch Timestamp Explained

Если вы когда-либо запрашивали базу данных или работали с современным API, вы, вероятно, видели, что даты возвращаются не как «12 октября 2026 года», а как массивная устрашающая строка чисел, например 1791800000. Это метка времени Unix, универсальная основа учета времени в информатике.

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

🎥 Обучающее видео: Проблема Y2K38 и эпохальное время (Заполнитель для встроенного концептуального руководства YouTube)

Происхождение: 1 января 1970 г.

Временная метка Unix — это просто количество секунд, прошедших с 1 января 1970 года в 00:00:00 UTC. Этот точный момент в истории известен как «Эпоха Unix».

Почему 1970 год? Потому что в начале 1970-х годов хранение было невероятно дорогим. Сохранение даты в виде удобочитаемой строки, например «1970-01-01 00:00:00», занимает около 20 байт памяти. Сохранение его в виде одного 32-битного целого числа заняло всего 4 байта. Начав с момента изобретения Unix, они максимизировали количество будущего времени, которое они могли хранить в этих 4 байтах.

Почему разработчики любят временные метки Unix

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

Если вы сохраните событие в базе данных, используя время локального сервера («15:00 EST»), а затем перенесете свой сервер в Лондон, вся ваша математика сломается. Но если событие происходит в момент времени 1700000000, это число одинаково, независимо от того, находится ли пользователь, запрашивающий его, в Токио, Нью-Йорке или Париже. Интерфейсное приложение просто берет это целое число и математически преобразует его в местный часовой пояс пользователя на его экране.

Конвертируйте временные метки мгновенно

Не пытайтесь мысленно рассчитывать секунды. Используйте наш автономный инструмент, чтобы мгновенно переводить 10-значные или 13-значные отметки времени в удобочитаемые даты в вашем местном часовом поясе.

Открыть конвертер временных меток

Секунды против миллисекунд (правило 10 против 13 цифр)

Одна из наиболее распространенных ошибок в веб-разработке — передача метки времени функции и получение даты в 1970 или 52 000 году. Это происходит из-за путаницы между секундами и миллисекундами.

  • Стандартное время Unix (секунды): 10-значное число (например, 1700000000). Это стандарт в Linux, PHP и большинстве серверных баз данных, таких как MySQL.
  • Время JavaScript (миллисекунды): 13-значное число (например, 1700000000000). Функция Date.now() JavaScript включает миллисекунды для большей точности.

Если вы введете в JavaScript десятизначную временную метку серверной части, не умножая ее на 1000, JavaScript предположит, что вы говорите о первых нескольких днях января 1970 года.

// Correctly handling a Unix timestamp in JavaScript
const backendTimestamp = 1700000000;
const dateObject = new Date(backendTimestamp * 1000);

console.log(dateObject.toLocaleDateString()); // Converts to local user timezone

Проблема 2038 года (Y2K38)

Время Unix имеет надвигающийся крайний срок. Поскольку изначально оно хранилось как 32-битное целое число со знаком, максимальное число, которое оно может хранить, составляет 2,147,483,647.

19 января 2038 г., в 03:14:07 UTC, часы Unix достигнут этого максимального значения. Через секунду целое число переполнится, превратившись в отрицательное число. Устаревшие системы, которые не были обновлены до 64-битной архитектуры, внезапно поверят, что на дворе 1901 год, что приведет к катастрофическим сбоям в программном обеспечении по всему миру.

К счастью, почти все современное оборудование, базы данных и языки программирования (например, 64-битные ядра Linux и современный Node.js) уже перешли на 64-битное время, отодвигая следующее переполнение на миллиарды лет вперед.

Часто задаваемые вопросы (FAQ)

Учитывает ли время Unix дополнительные секунды?

Удивительно, но нет. Время Unix предполагает, что каждый день имеет ровно 86 400 секунд. Когда мир добавляет «дополнительную секунду», чтобы приспособиться к вращению Земли, системы Unix обычно просто повторяют одну и ту же временную метку дважды, чтобы оставаться синхронизированными, не нарушая математических вычислений.

Может ли временная метка Unix быть отрицательной?

Да. Любая временная метка меньше 0 представляет дату, предшествовавшую эпохе Unix (1 января 1970 г.). Например, -86400 соответствует точно 31 декабря 1969 года.

Почему моя преобразованная дата всегда отображается как 1970 год?

Вероятно, вы передаете 10-значную временную метку в функцию, которая ожидает 13 цифр (миллисекунд). Умножьте свою временную метку на 1000, прежде чем конвертировать ее.