Что такое Unix timestamp и почему тебе должно быть не всё равно?
То гигантское число в твоей базе данных не случайное. Вот что оно означает и как с ним работать.
Ты отлаживаешь ответ API. Есть поле с названием created_at со значением 1704067200. Какой это день?
Это Unix timestamp. Это количество секунд с 1 января 1970 года. И как только ты это поймёшь, ты будешь видеть его везде.
Почему 1970?
Unix разрабатывался в конце 1960-х. Дизайнерам нужна была отправная точка для вычислений времени. 1 января 1970 года был достаточно недавним, чтобы быть практичным, и достаточно ранним, чтобы охватить большую часть истории вычислений.
Этот момент — полночь UTC 1 января 1970 года — называется эпохой Unix.
Почему секунды вместо дат?
Даты сложны. Часовые пояса, летнее время, високосные годы, переменная длина месяцев. "15 марта 2024 года в 3 часа дня EST" требует много парсинга.
Timestamp — это просто число. 1710522000. Легко хранить, легко сравнивать, легко делать математику.
Хочешь знать, какое событие произошло первым? Сравни два числа. Хочешь знать, сколько что-то заняло? Вычти timestamps. Хочешь добавить 24 часа? Добавь 86400.
Преимущество часовых поясов
Вот умная часть: timestamps всегда UTC.
Когда кто-то в Токио и кто-то в Нью-Йорке оба записывают один и тот же момент, они получают один и тот же timestamp. Отображение может различаться — один видит 9 утра, другой видит 7 вечера — но базовое число идентично.
Это делает возможными распределённые системы. Базы данных, API, лог-файлы — все используют одну и ту же точку отсчёта независимо от того, где находятся серверы.
Миллисекунды vs секунды
JavaScript использует миллисекунды с эпохи. Большинство других языков используют секунды.
1704067200 (секунды) = 1 января 2024, 00:00:00 UTC
1704067200000 (миллисекунды) = Тот же момент
Если timestamp выглядит слишком большим, вероятно, это миллисекунды. Раздели на 1000.
Быстрое чтение Timestamps
Несколько опорных точек для калибровки твоей мысленной математики:
- 1000000000 (1 миллиард) = 9 сентября 2001
- 1600000000 = Сентябрь 2020
- 1700000000 = Ноябрь 2023
- 1800000000 = Январь 2027
Текущие timestamps в диапазоне 1.7 миллиарда. Если ты видишь что-то, начинающееся с 17, это, вероятно, недавний timestamp.
Частые операции
Текущий timestamp:
Math.floor(Date.now() / 1000) // JavaScript
import time; int(time.time()) # Python
Timestamp в дату:
new Date(1704067200 * 1000) // JavaScript нужны миллисекунды
Дата в timestamp:
Math.floor(new Date('2024-01-01').getTime() / 1000)
Проблема 2038 года
Unix timestamps изначально хранились как 32-битные знаковые целые числа. Максимальное значение? 2,147,483,647.
Это 19 января 2038 года, 03:14:07 UTC.
После этого момента 32-битные системы переполнятся. Это Y2K для timestamps.
Большинство современных систем сейчас используют 64-битные целые числа, которые не переполнятся миллиарды лет. Но унаследованные системы существуют. Если ты работаешь со старым кодом, стоит проверить.
Когда Timestamps становятся странными
Отрицательные timestamps. Даты до 1970 — отрицательные числа. -86400 — это 31 декабря 1969 года.
Високосные секунды. UTC иногда добавляет секунду, чтобы оставаться синхронизированным с вращением Земли. Большинство систем игнорируют это. Иногда это вызывает хаос.
Drift часов. Часы серверов могут не соглашаться. Два timestamps с разных машин могут быть не напрямую сравнимыми, если часы не были синхронизированы.
Timestamps везде, как только начинаешь смотреть. API-ответы, записи баз данных, лог-файлы, куки. Понимание их делает отладку быстрее, а код, связанный со временем, менее загадочным.