Розробка · 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, однозначний, правильно сортується як текст і явно вказує часовий пояс. Переводити одне в інше — якраз завдання конвертера міток часу.

Відкрити конвертер часових міток

LinkedInXFacebook