Инструменты разработчика · Конвертер временных меток Unix
Ошибка off-by-1000: когда дата показывает январь 1970 или год 56000
· Почему это важно
временные метки отладка рабочий процесс разработчика
Пропуск секунд вместо ожидаемых миллисекунд (или наоборот) является наиболее распространенной ошибкой временных меток. В этом посте показано, как он выглядит в каждом направлении, где прячется между языками и как его поймать за считанные секунды.
Каждый пользователь присоединился 1 января 1970 — экран, выдающий ошибку, и серверная часть, которая была совершенно правильной.
Страница профиля, показывающая все учетные записи около января 1970, является сильным признаком масштабирования. Серверная часть могла вернуть правильные секунды эпохи, в то время как внешний код передавал их непосредственно конструктору Date, который интерпретирует миллисекунды. Затем современные значения уменьшаются на календарной оси в тысячу раз.
Не исправляйте отображение, добавляя постоянный год или заменяя дату. Запишите необработанное поле, его контракт API и точный вызов конструктора. ToolAcre позволяет принудительно использовать оба устройства, поэтому одно значение можно проверить без изменения производственных данных. Показания, соответствующие другому известному событию, идентифицируют вероятную ошибку границы.
Два симптома: секунды, переданные миллисекунде API, приземлившейся в январе 1970, и миллисекунды, переданные секундам API, приземлившейся через десятки тысяч лет.
Секунды, интерпретируемые как миллисекунды, приближаются к эпохе, потому что миллиард миллисекунд — это лишь небольшая часть столетия. Обратная ошибка расширяет значение триллиона миллисекунд до триллиона секунд, что часто выходит за пределы обычных диапазонов приложений. Обе ошибки сохраняют цифры при изменении их масштаба.
Опубликованная статья «десять против тринадцати цифр» уже объясняет современную визуальную эвристику и ее ограничения. Вместо этого эта статья фокусируется на диагностике и предотвращении: явный выбор единиц, независимые свидетельства событий и одно преобразование на интерфейсе, где представление производителя соответствует контракту потребителя.
Поскольку обе ветви детерминированы, симптом можно воспроизвести с помощью одного прибора. Благодаря этому несоответствие единиц измерения легче доказать, чем периодическое отклонение тактового сигнала или поведение при форматировании языкового стандарта.
Там, где обычно проходит граница — JavaScript и Java за миллисекунды, инструменты Unix, Python и большинство баз данных за секунды, а полезная нагрузка JSON между ними
Этот репозиторий доказывает, что JavaScript Date потребляет миллисекунды и что ToolAcre умножает секунды, прежде чем создать единицу. Он не устанавливает значения по умолчанию для каждой Java, Python, оболочки или базы данных API, указанных в книге. Эти контракты должны быть проверены там, где они используются.
Номер JSON не содержит метаданных устройства. Присвоение полю имени `created_at` позволяет избежать неоднозначности между службами; присвоение ему имени `created_at_s` или документирование строки ISO делает контракт доступным для проверки. Принимающий адаптер должен один раз преобразовать в свое внутреннее представление, а не разбрасывать умножения по представлениям.
Напишите преобразование рядом с определением границы, а не внутри многократно используемого помощника отображения. Адаптер знает контракт производителя; универсальный форматтер должен получить уже нормализованный момент.
Граница объекта зависит от API; этот репозиторий доказывает, что JavaScript Дата использует миллисекунды
Слабый прибор, такой как `0`, не может обнаружить ошибку, поскольку ноль секунд и ноль миллисекунд обозначают эпоху. Небольшие вымышленные значения также могут выглядеть как правдоподобные 1970 даты. Макет, который возвращает тот же масштаб, которого ожидает его потребитель, никогда не демонстрирует реального несоответствия интеграции.
Выберите ненулевой известный момент и сделайте две интерпретации заметно разными. Подтвердите канонический результат ISO на границе, а не просто факт существования объекта Date. Включите регистр миллисекунд и регистр секунд; Именно по этой причине собственные тесты ToolAcre сравнивают 1,000,000 под каждым устройством.
Ошибки модулей сохраняются всякий раз, когда тесты не различают эти две шкалы.
Рассмотрим `created_at: 1738578000`. Через несколько секунд он становится `2025-02-03T10:20:00.000Z`; принудительно заданное значение в миллисекундах, оно становится `1970-01-21T02:56:18.000Z`. Запись о развертывании, которая, как известно, была создана в феврале 2025, устраняет двусмысленность, не полагаясь исключительно на подсчет цифр.
Сохраняйте необработанный JSON рядом с этим известным событием при исправлении адаптера. Если бы поле было `1738578000000`, миллисекундная интерпретация идентифицировала бы тот же момент. Эти два значения никогда не должны приниматься как взаимозаменяемые внутри одной схемы, даже если преобразователь может продемонстрировать их эквивалентность после применения правильного масштаба.
Известная дата развертывания является независимым доказательством. Без этого выбор более правдоподобного вывода может закодировать ожидания исследователя, а не установить, что имел в виду производитель.
Рабочий пример: проверьте значение созданного_at в обоих явных модулях.
Надежный ремонт начинается на границе: анализируйте документированный исходный модуль, преобразуйте ровно один раз и предоставляйте типизированное или четко названное внутреннее значение. Описания схем, примеры и сгенерированные клиенты должны сохранять суффикс или формат даты и времени. Рецензент может затем обнаружить дополнительное умножение перед выполнением.
Добавьте прибор регрессии с реальным масштабом и фиксированным ожиданием ISO. Избегайте автоматического обнаружения в коде приложения, если у производителя есть контракт; эвристика предназначена для исследования неопределенных устаревших данных. ToolAcre точно помечает свой обнаруженный выбор, чтобы предположение не могло маскироваться под гарантированные метаданные.
Чего это не касается — ошибки часовых поясов, из-за которых дата сдвигается на часы, а не на десятилетия.
Ошибка часового пояса обычно смещает отображение на часы и может пересекать один календарный день. Ошибка с коэффициентом 1,000 смещается на десятилетия или тысячелетия. Смешение диагнозов способствует корректировке смещения вокруг значения, масштаб которого уже неверен. Проверьте устройство перед проверкой локального форматирования.
Точно так же неправильное начало эпохи может оставаться бессмысленным как в секундах, так и в миллисекундах. Если ни одна из интерпретаций не соответствует ни одному известному событию, прекратите переключение и найдите источник. Конвертер сужает гипотезы; это не доказывает, что каждое большое целое число — это время Unix.
Если год правдоподобен, но час постоянно смещается, исследуйте представление зоны. Разделение этих шкал симптомов сокращает путь от снимка экрана до основной причины.
Вывод: неправильная единица измерения — неправильный век — и как указанная единица измерения конвертера временных меток Unix позволяет мгновенно проверить оба показания.
Неправильная единица — это не косметические метаданные — она меняет мгновение. Рассматривайте 1970-тяжелые экраны и неправдоподобно далекие годы как сигналы для проверки соединения производитель-потребитель. Стоимость, контракт на единицу и известное событие представляют собой трехчастное доказательство, более сильное, чем очевидно разумная дата.
Используйте конвертер для сравнения явных показаний, а затем закодируйте выбранную шкалу в названиях, типах и тестах. Цель не в том, чтобы научить программное обеспечение более умно гадать. Это значит удалить предположение из пути, который создает даты для пользователей.
При проверке кода на каждой границе можно задать один точный вопрос: какой модуль входит, а какой уходит? Это более надежно, чем распознавание определенного количества цифр.