Що таке Unix timestamp (і навіщо його використовують розробники)?
Unix timestamp — це одне ціле число: кількість секунд, що минули з 1 січня 1970 року о 00:00:00 UTC. Цей момент називається Unix epoch, і кожна секунда відтоді відраховується безперервно.
Поточний timestamp прямо зараз десь близько 1,750,000,000. Сам по собі цей номер каже будь-якому комп’ютеру, базі даних або API, який саме момент часу ви маєте на увазі — без двозначності.
Чому саме 1970?
Unix розробляли наприкінці 1960-х у Bell Labs. Коли інженерам знадобилась фіксована точка відліку часу, вони вибрали 1 січня 1970 року — початок нового десятиліття, легко міркувати, і достатньо «нещодавно», щоб для практичних дат не потрібні були від’ємні числа.
Це був прагматичний вибір, а не “принциповий”. І він закріпився.
Яку проблему розв’язують Unix timestamps
Представлення дат як рядків, зручних для людей, створює неоднозначність на кожному рівні:
- Різні формати:
03/04/25— це 4 березня чи 3 квітня? Це 1925 чи 2025? - Плутанина з часовими поясами: “3pm Friday” означає різний момент у Лондоні та Токіо
- Локальні відмінності: десь пишуть день-місяць-рік, десь місяць-день-рік
Unix timestamp обходить усе це. 1711929600 — це один однозначний момент часу незалежно від того, де ви знаходитесь і який формат вам подобається. Машини погоджуються; люди — конвертують.
Секунди, мілісекунди та мікросекунди
Оригінальний Unix timestamp вимірюється в секундах. Але різні системи використовують різну точність:
| Формат | Одиниця | Приклад |
|---|---|---|
| Unix (POSIX) | Секунди | 1711929600 |
JavaScript Date.now() | Мілісекунди | 1711929600000 |
Python time.time() | Секунди (float) | 1711929600.123 |
| Timestamps у БД | Часто мікросекунди | 1711929600000000 |
Це одна з найчастіших причин багів при інтеграції між системами. JavaScript timestamp, переданий напряму у Python або Go, буде в 1 000 разів більшим за очікуване. Завжди перевіряйте точність/роздільність, коли переходите між системами.
Як читати та записувати Unix timestamps
У JavaScript / TypeScript
// Current timestamp in seconds
Math.floor(Date.now() / 1000)
// Current timestamp in milliseconds
Date.now()
// Convert timestamp (seconds) to Date object
new Date(timestamp * 1000)
// Convert Date to timestamp (seconds)
Math.floor(new Date('2024-04-01').getTime() / 1000)
У Python
import time, datetime
# Current timestamp (float)
time.time()
# Convert to datetime
datetime.datetime.fromtimestamp(1711929600)
# Convert datetime to timestamp
datetime.datetime(2024, 4, 1).timestamp()
У SQL (PostgreSQL)
-- Current timestamp
EXTRACT(EPOCH FROM NOW())::int
-- Convert to timestamp
TO_TIMESTAMP(1711929600)
Часові пояси не впливають на сам timestamp
Це важливо й часто неправильно розуміють.
Unix timestamp завжди означає момент у UTC. Коли ви його показуєте, ви конвертуєте його в локальний часовий пояс. Коли ви його зберігаєте, ви зберігаєте UTC значення. Сам timestamp не “прив’язаний” до часового поясу.
Це означає:
- Два користувачі в різних часових поясах, які зберігають “зараз”, отримають однаковий timestamp
- Під час відображення кожен побачить локальний час
- У базі даних не потрібні жодні offset-правки — лише на рівні представлення
Проблема 2038 року
Unix timestamps, збережені як 32-бітне signed ціле число, можуть рахувати лише до 2,147,483,647 секунд — це відповідає 19 січня 2038 року о 03:14:07 UTC. Після цього 32-бітний лічильник переповнюється в велике від’ємне число.
Системи, які досі зберігають timestamps у 32 бітах, зламаються в цю дату. Більшість сучасних систем використовують 64-бітні цілі числа, що відсуває переповнення на рік 292 мільярди — практично неважливо для реального життя.
Якщо ви працюєте з embedded системами, застарілими БД або старим C-кодом, варто перевірити, як саме там зберігаються timestamps.
Коли використовувати Unix timestamp
Використовуйте Unix timestamp, коли:
- Зберігаєте дати в базі й хочете простий, сортувальний integer
- Передаєте дати між системами або API
- Порівнюєте або сортуєте події хронологічно
- Рахуєте тривалість (просто віднімаєте два timestamps)
- Працюєте з кешем або логікою протермінування (
expires_at = now + 3600)
Використовуйте форматований рядок дати, коли:
- Показуєте дату користувачу
- Логуєте події у форматі, зручному для людей
- Працюєте в таблицях або CSV-експорті
Швидкі конвертації
| Що | Секунди |
|---|---|
| 1 хвилина | 60 |
| 1 година | 3,600 |
| 1 день | 86,400 |
| 1 тиждень | 604,800 |
| 30 днів | 2,592,000 |
| 1 рік (прибл.) | 31,536,000 |
Unix Timestamp Converter конвертує будь-який timestamp у читабельну дату або перетворює дату в Unix timestamp миттєво.