qatoolqa.ru

Unix-время: конвертер таймстемпов и дат

Перевод Unix-времени в человекочитаемую дату и обратно, ISO 8601, часовые пояса и разница между двумя метками. Секунды и миллисекунды различаются автоматически. Полезно, когда сервер отдаёт метку, интерфейс показывает своё, и надо понять, кто из них прав.

Метка или дата

Разница между метками

Где обычно ошибаются

Секунды или миллисекунды. Unix-метка бывает и той, и другой, а по виду они различаются только длиной: 10 цифр — секунды, 13 — миллисекунды. Перепутали в одну сторону — получите 1970 год, в другую — пятидесятитысячный. Инструмент всегда показывает, как прочитал, и что вышло бы при другом прочтении.

В самой метке нет часового пояса. Unix-время всегда считается от полуночи UTC, поэтому «метка в московском времени» — бессмыслица, хотя так говорят. Пояс появляется только когда число превращают в текст, и именно там разъезжаются сервер и интерфейс.

ISO без Z читается иначе, чем с ним. Ловушка в самом JavaScript: new Date("2025-01-01T00:00:00") — это местная полночь, а new Date("2025-01-01") — уже полночь UTC. Одна и та же дата, записанная двумя способами, даёт моменты, разные на величину смещения. Отсюда тесты, которые проходят в Калининграде и падают во Владивостоке.

Прибавить месяц — не то же, что прибавить 30 суток. К 31 января плюс месяц даёт 3 марта: в феврале нет тридцать первого числа, и дата переползает через край. В високосный год — 2 марта: день февралю добавили, переползать пришлось на сутки меньше. То есть результат зависит ещё и от года, и это уже вторая неожиданность в одном действии. Так считает и JavaScript, и многие базы, но не все — часть систем зажимает результат к 28 февраля. Кнопки сдвига здесь показывают именно поведение с переползанием; если ваш бэкенд отвечает иначе, это и есть расхождение, которое стоит завести в баг. У суток, часов и недель такой беды нет — там фиксированное число миллисекунд.

Рабочие дни считаются грубо, и это намеренно. Смены по 8 часов — это просто часы, делённые на восемь, а будние дни — те, что не суббота и не воскресенье. Праздники не вычитаются: производственный календарь свой у каждой страны, меняется каждый год и требует обновления, которое некому делать. Честнее показать чистую арифметику и сказать, что праздники вы вычтете сами, чем молча ошибаться на переносах.

Смещение — не пояс. +03:00 говорит, на сколько сдвинуто время, но не говорит, что это за место и переходит ли оно на летнее. Для будущих событий сохранять надо название пояса, иначе после очередного перевода стрелок встреча уедет на час.

Частые вопросы

Метка в секундах или в миллисекундах?

Десять цифр — секунды, тринадцать — миллисекунды. Страница определяет это сама, но переключатель есть: перепутанный порядок даёт дату в 1970 году или в далёком будущем.

Почему на стенде дата уезжает на несколько часов?

Почти всегда причина в том, что сервер отдаёт UTC, а интерфейс показывает локальное время без пересчёта. Сравните оба значения здесь.

Учитываются ли переходы на летнее время?

Да, для исторических дат в часовых поясах, где переход был. Для России после 2014 года перехода нет.