Инструменты разработчика · Конвертер временных меток Unix
Одна временная метка, два часа: почему UTC и местное время различаются для одной эпохи
· Как это работает
временные метки Unix-время часовые пояса
Значение эпохи обозначает одно мгновение, но время, которое вы видите на настенных часах, зависит от того, где вы находитесь. В этом посте объясняется арифметика смещения, почему сама дата может отличаться и почему конвертер показывает оба показания.
Клиент сообщает 9 утра, в журнале указано 16:00 — то же событие, два часа и запрос в службу поддержки, который ни к чему не приводит.
Обращение в службу поддержки может застопориться, если один человек сообщит «девять утра», а в журнале приложения будет запись 16:00. Ни одна из меток часов не идентифицирует событие до тех пор, пока не станет известна его зона или смещение. Если обе ссылки относятся к одной и той же эпохе, поиск семичасовой задержки обработки приведет к потере результатов исследования из-за разницы в отображении.
Начните со сбора необработанной временной метки и контекста зоны каждого наблюдателя. ToolAcre показывает UTC и текущее локальное чтение браузера из одного преобразования, поэтому сравнение становится немедленным для человека, владеющего журналом. Коллеге в другом месте следует сравнить общее значение ISO, а не предполагать, что локальная строка первого человека применима к его машине.
Эпоха — это мгновение, а не время на настенных часах — отсчет секунд с момента 1970, у которого нет собственной зоны.
Эпоха — это расстояние от 1970-01-01T00:00:00Z в секундах или миллисекундах. Он не содержит города, флага перехода на летнее время или предпочтительного обозначения часов. Таким образом, значение 1,700,000,000 идентифицирует один момент; такие ярлыки, как вечер вторника или утро среды, представляют собой прогнозы, сделанные после выбора того, как читать в данный момент.
Вот почему сохранение исправленной «локальной эпохи» является ошибкой категории. Добавление смещения изменяет счетчик и точки в другой момент. Сохраните или передайте исходное мгновение, а затем примените правило чтения на том краю, где человеку нужен календарь. ToolAcre следует этой форме, сохраняя числовые секунды и миллисекунды рядом с форматированными выходными данными.
Как применяется смещение — добавление или вычитание часов и минут, получасовых и 45 минутных зон, а также смещений, которые меняются в течение года.
Для фиксированного смещения арифметика проста: UTC+09:00 показывает, что часы опережают UTC на девять часов, а UTC-05:00 показывают отставание на пять часов. Части часа обрабатываются как минуты, поэтому смещение в сорок пять минут не может быть безопасно представлено округлением до целого часа. Знак относится к отображаемому местному чтению.
Фиксированное смещение по-прежнему представляет собой только одно наблюдение. ToolAcre запрашивает у Intl смещение, применимое к выбранному моменту в текущей зоне браузера. При этом не предполагается, что сегодняшняя компенсация применяется в течение всего года. Таким образом, копирование одного смещения в конфигурацию приложения может показаться правильным во время тестирования и завершиться неудачей при изменении применимого правила среды.
Когда дата тоже меняется — моменты около полуночи, которые приходятся на разные календарные дни в UTC и локально.
Арифметика часов может пересекать границы календаря. Мгновение в 00:20 UTC появляется в предыдущую дату под отрицательным смещением, а затем в ту же дату под положительным смещением. Заявка, в которой записано только «14-е число», может, следовательно, ссылаться на разные фрагменты журнала UTC, даже если оба участника точно помнят свои собственные календари.
Используйте полную дату, время и смещение при передаче события между командами. Строка ISO преобразователя предотвращает отсоединение даты от UTC, а локальная строка обеспечивает знакомый контекст. Если инцидент длится полночь, упорядочивайте записи по эпохам или UTC вместо того, чтобы сортировать человеческие метки, написанные в нескольких зонах.
Рабочий пример: 1700000000 в UTC, в зоне UTC+9 и в зоне UTC−5 — выписывается арифметика и сравниваются даты
В существующей опубликованной статье модуля установлено, что 1,700,000,000 секунд равно `2023-11-14T22:13:20.000Z`. При фиксированном показателе +09:00 добавьте девять часов, чтобы получить 2023-11-15 07:13:20; при фиксированном −05:00 вычтите пять часов, чтобы получить 2023-11-14 17:13:20. Дата меняется только в восточном примере.
Эти два смещенных показания являются арифметическими демонстрациями, а не утверждениями о названных городах в эту дату. Локальной строке ToolAcre должно быть разрешено сообщать о любом смещении, которое Intl предоставляет для фактической зоны браузера. Сравните его со значением UTC и запишите отображаемое смещение, а не принудительно добавляйте какое-либо иллюстративное значение к результату.
Рабочий пример: одна эпоха в UTC, затем два явных показания с фиксированным смещением.
Отображение обоих показаний исключает мысленное вычитание из сеанса отладки. Команда сервера может указать UTC, а человек, воспроизводящий проблему, может распознать увиденные локальные часы. Поскольку обе строки происходят от одной даты, совпадение секунд и миллисекунд доказывает, что они не редактировались независимо и не округлялись до отдельных событий.
Эта пара особенно полезна на скриншотах: включите примечание к единице измерения и строку ISO вместо обрезки до знакомого локального значения. Обрезанные часы можно интерпретировать по-новому после путешествия или изменения настройки зоны. Эпоха плюс ISO остается стабильной, а локальный рендеринг объясняет взаимодействие с пользователем, не заменяя эту стабильную ссылку.
Чего это не касается — исторические изменения смещения и политические решения о часовых поясах, которые хранятся в базе данных tz, а не в арифметике.
Простое сложение не может описать региональную зону, применимое смещение которой варьируется. Конвертер делегирует локальное форматирование Intl, но его репозиторий не предоставляет базовую таблицу правил или исторические решения. Поэтому в этой статье не перечисляются прошлые изменения, не прогнозируется будущая политика и не обещаются идентичные результаты от двигателей, несущих разные данные.
Если приложению необходимо запланировать «09:00 в этом месте», сохраните именованную зону и используйте структуру планирования с учетом зоны. Когда он должен записать «этот запрос произошел сейчас», задержитесь на мгновение. Это разные требования к данным. Фиксированный `+02:00` может описывать чтение в один момент без указания регионального правила, которое его создало.
Арифметика с фиксированным смещением не может воспроизвести изменение региональных правил.
Представьте, что эпоха – это булавка на временной шкале, а циферблаты – как метки, расположенные вокруг нее. UTC предоставляет общую метку; локальное форматирование обеспечивает удобство. ToolAcre представляет оба варианта без изменения вывода, поэтому ожидается разница в часах, а не свидетельство потерянного времени.
Для спорного события вставьте исходное значение счетчика, явно укажите единицу измерения и поделитесь выходными данными ISO. Тогда прикрепляйте локальные показания только в виде аннотаций. Этот порядок превращает «мои часы против ваших» в проверяемое сопоставление и не позволяет изменениям границ дат маскироваться под события в разные дни.