Розробка · 3 хв читання ·
Unix-час: секунди чи мілісекунди?
Баг із 13 цифрами, який щотижня потрапляє в продакшн, і дуже просте правило, як відрізнити одну одиницю від іншої.

JavaScript рахує в мілісекундах, більшість бекендів — у секундах. Переплутайте їх, і дати опиняться в січні 1970 року або на десятки тисяч років у майбутньому.
Порахуйте цифри
Сучасна часова мітка в секундах має 10 цифр (1790000000 — це 21 вересня 2026 року). Той самий момент у мілісекундах має 13 цифр, у мікросекундах 16, у наносекундах 19.
Правило
Якщо абсолютне значення більше за 10¹², це мілісекунди; інакше вважайте його секундами. Правило працює для будь-якої мітки в мілісекундах після вересня 2001 року і будь-якої мітки в секундах до 33658 року.
const ms = Math.abs(n) > 1e12 ? n : n * 1000;
Мітка часу не має часового поясу
Мітка часу Unix рахує секунди від 1 січня 1970 року, 00:00 UTC. Одне й те саме число означає той самий момент у будь-якій точці світу; змінюється лише спосіб показу. Баги з’являються, коли місцевий час переводять у мітку так, ніби це UTC: усі дати зсуваються на ваш часовий пояс, часто на годину-дві, і ще раз під час переходу на літній час. Зберігайте й передавайте мітки в UTC, а в місцевий час переводьте лише під час показу людині.
Поточний час у популярних мовах
JavaScript Date.now() мілісекунди
JavaScript Math.floor(Date.now() / 1000) секунди
Python time.time() секунди (з дробовою частиною)
Java System.currentTimeMillis() мілісекунди
Go time.Now().Unix() секунди
PostgreSQL EXTRACT(EPOCH FROM now()) секунди
MySQL UNIX_TIMESTAMP() секунди
Дати до 1970 року та 2038 рік
Від’ємні мітки часу допустимі: −86400 — це 31 грудня 1969 року. Деякі старі системи й таблиці з ними не впораються, тому дати народження та історичні дані — часте джерело помилок. З іншого боку, 32-бітне ціле зі знаком закінчується на 2147483647, тобто 19 січня 2038 року о 03:14:07 UTC. Системи, які досі зберігають мітки в 32 бітах, перескочать у 1901 рік; 64-бітне зберігання знімає проблему на мільярди років.
Високосні секунди
Час Unix ігнорує високосні секунди: у кожній добі рівно 86 400 секунд. Це спрощує арифметику, і майже для будь-якого застосунку різниця не важлива. Враховувати її треба лише системам, яким потрібні точні інтервали через високосну секунду, наприклад деяким науковим чи фінансовим.
Швидкий чек-лист для налагодження
- Дата потрапила в січень 1970 року: значення в секундах прочитали як мілісекунди.
- Рік п’ятизначний: значення в мілісекундах прочитали як секунди.
- Усі дати зсунуті на однакову кількість годин: місцевий час прийняли за UTC або навпаки.
- Частину року дати зсунуті на годину: проігноровано перехід на літній час.
- Дати перескакують у 1901 рік: переповнення 32-бітного числа.
Обирайте одиницю явно
Конвертер часових міток 4Dev не вгадує: "Unix Timestamp" — це секунди, а "Unix Timestamp (ms)" — мілісекунди, поруч є варіанти в мікро- та наносекундах. Загалом 33 формати, зокрема ISO 8601, RFC 2822, SQL DATETIME і порядкові дати Excel.
ISO 8601, коли дату читають люди
Мітки часу ідеальні для зберігання й обчислень, але людям їх важко читати. У логах, API та файлах, які відкривають люди, формат ISO 8601, наприклад 2026-09-21T14:30:00Z, однозначний, правильно сортується як текст і явно вказує часовий пояс. Переводити одне в інше — якраз завдання конвертера міток часу.