Содержание
Открыли логи сервера или ответ какого-нибудь API, а там вместо даты —
длинное число: 1780477200. Или в токене авторизации поле exp с таким же
числом. Это не код ошибки и не идентификатор. Это время, записанное так, как
его удобно хранить компьютеру, — Unix timestamp. Разберём, что это за число
и почему оно отсчитывается именно от 1970 года.
Компьютеру проще хранить время одним числом
Представьте, что нужно узнать, сколько времени прошло между двумя событиями. Человеку с датами это несложно на глаз, а машине — морока: в марте 31 день, в феврале 28 или 29, год бывает високосным, месяцы разной длины. Вычитать «3 июня минус 15 января» по календарю — значит помнить все эти правила.
Поэтому придумали хранить момент времени как одно целое число — сколько секунд прошло с некой стартовой точки. Тогда любые вычисления со временем превращаются в обычную арифметику:
Сколько прошло = timestamp сейчас − timestamp тогда
(просто вычитание двух чисел, в секундах)
Возраст события, срок жизни токена, «показать посты за последние 24 часа» — всё это становится вычитанием и сравнением чисел. Ни високосных лет, ни разной длины месяцев — ими займутся уже потом, когда число нужно будет показать человеку.
Точка отсчёта — 1 января 1970 года
Стартовую точку назвали эпохой Unix (Unix epoch) — это полночь 1 января
1970 года по UTC. Число вроде 1780477200 означает «столько-то секунд после
этого момента». Выбор даты чисто практический: систему Unix создавали на
рубеже 1960–70-х, и разработчикам была нужна круглая недавняя дата, от
которой удобно вести счёт. Взяли начало 1970-го — и с тех пор так считает
почти вся вычислительная техника.
1780477200 секунд от 01.01.1970 00:00:00 UTC = 3 июня 2026, 12:00 по Москве
Перевести число в дату и обратно вручную нереально — это делает конвертер Unix timestamp: вводите число, получаете дату в нужном часовом поясе, или наоборот.
Timestamp не знает часовых поясов
Важная деталь: само число одно для всей планеты. 1780477200 — это один и
тот же миг для Москвы, Лондона и Владивостока. Разным будет только его
человеческое написание: в Москве это 12:00, в Лондоне 09:00, во
Владивостоке 19:00 — но момент физически один.
Это и есть главное удобство. Сервер в одном городе, пользователь в другом, база данных в третьем — все хранят время как единый timestamp в UTC и не путаются. Часовой пояс приклеивают в последний момент, когда дату показывают человеку. Как одно и то же время растекается по 11 часовым поясам России — отдельная история, но timestamp именно поэтому и удобен: он от поясов не зависит.
Секунды или миллисекунды
Иногда timestamp выглядит длиннее на три знака: не 1780477200, а
1780477200000. Это тот же момент, только в миллисекундах — счёт идёт не в
секундах, а в тысячных долях. Так время хранит, например, JavaScript.
Миллисекундный timestamp = секундный × 1000
1780477200 сек = 1780477200000 мс
Практическое правило: 10 знаков — это секунды, 13 знаков — миллисекунды. Если подставить одно вместо другого, дата уедет в далёкое прошлое или будущее в тысячу раз.
Проблема 2038 года
У счёта времени есть предел. Старые системы хранят timestamp в 32-битном знаковом числе, а у него максимум — 2 147 483 647. Именно столько секунд от 1970 года истечёт 19 января 2038 года в 03:14:07 UTC. В следующую секунду счётчик переполнится и вместо 2038 года покажет декабрь 1901-го — уйдёт в минус.
Это близкий родственник «проблемы 2000 года»: тогда боялись двузначной записи года, здесь — переполнения счётчика секунд. Лечится переходом на 64-битные числа: их хватит на сотни миллиардов лет вперёд. Современные системы давно на 64 битах, но кое-где в старом железе и коде 32-битный timestamp ещё встречается — к 2038-му его нужно везде заменить.
Коротко
Unix timestamp — это время, записанное как одно число: секунды с 1 января 1970 года по UTC. Компьютеру так проще хранить моменты, вычитать их и сравнивать, не отвлекаясь на календарь и часовые пояса. Число одно для всей планеты, а дата и пояс появляются только когда время показывают человеку.