Время в вычислительной технике

Часы, метки времени и синхронизация

Узнать о компьютерном времени

Компьютерам необходимо точное время для ведения журналов, планирования задач, проверки сертификатов безопасности, транзакций баз данных и бесчисленного множества других операций. Понимание того, как системы измеряют, хранят и синхронизируют время, необходимо для разработчиков, администраторов и всех, кто занимается решением проблем, связанных со временем.

Как компьютеры хранят время

Аппаратные часы

  • RTC (часы реального времени): микросхема с батарейным питанием, сохраняющая время при выключении
  • Кварцевый генератор: кварцевый кристалл, обеспечивающий стабильную частоту (обычно 32 768 Гц)
  • Дрейф: аппаратные часы уходят на секунды или минуты в месяц

Системные часы

  • Программные часы, поддерживаемые операционной системой
  • Инициализируются из RTC при загрузке
  • Синхронизируются через сетевые протоколы (NTP)
  • Могут корректироваться чаще, чем RTC

Протокол сетевого времени (NTP)

NTP синхронизирует часы компьютеров по сети, обеспечивая миллисекундную точность через интернет и субмиллисекундную в локальных сетях.

Уровни стратума

СтратумИсточникТочность
0Атомные часы, GPS-приёмникНаносекунды
1Напрямую подключён к стратуму 0Микросекунды
2Синхронизирован со стратумом 1Миллисекунды
3–15Каждый уровень синхронизируется с вышестоящимПостепенно снижается

Как работает NTP

  1. Клиент отправляет запрос с меткой времени
  2. Сервер отвечает своими метками времени
  3. Клиент вычисляет сетевую задержку и смещение
  4. Часы постепенно корректируются (плавная подстройка) во избежание скачков

Форматы хранения времени

ФорматПримерПрименение
Unix-метка (с)1705329000Базы данных, API
Unix-метка (мс)1705329000000JavaScript, Java
ISO 86012024-01-15T14:30:00ZJSON, API, журналы
RFC 2822Mon, 15 Jan 2024 14:30:00 +0000Заголовки электронной почты
SQL DATETIME2024-01-15 14:30:00Базы данных
SQL TIMESTAMP2024-01-15 14:30:00Автообновляемые поля

Проблемы распределённых систем

Расхождение часов

Разные машины имеют незначительно различающееся время, что приводит к:

  • Нарушению порядка событий в журналах
  • Состояниям гонки в распределённых транзакциях
  • Ошибкам проверки сертификатов

Решения

  • NTP/PTP: поддержание синхронизации часов
  • Логические часы: векторные часы, метки времени Лэмпорта
  • Протоколы консенсуса: Raft, Paxos для упорядочивания событий
  • TrueTime (Google): GPS-синхронизация с ограниченной неопределённостью

Распространённые проблемы со временем

Проблема Y2K (1999–2000)

Двузначное представление года не позволяло обозначить 2000 год. Исправление обошлось в миллиарды долларов по всему миру.

Проблема 2038 года

32-битные Unix-метки времени переполнятся 19 января 2038 года. Ведётся переход на 64-битные значения.

Ошибки секунд координации

Некоторые системы дают сбой, когда часы показывают 23:59:60. Секунды координации будут упразднены к 2035 году.

Ошибки перехода на летнее время

Запланированные задачи могут выполняться дважды или пропускаться при переводе часов.

Лучшие практики

  • Используйте UTC внутри системы: храните и обрабатывайте в UTC; конвертируйте для отображения
  • Используйте ISO 8601: однозначный, сортируемый формат
  • Включайте информацию о часовом поясе: 2024-01-15T14:30:00+05:30, а не просто «14:30»
  • Синхронизируйте через NTP: поддерживайте все серверы в пределах миллисекунд
  • Тестируйте пограничные случаи: переходы на летнее время, високосные годы, границы лет
  • Используйте 64-битные метки времени: избегайте проблемы 2038 года

Заключение

Компьютерное время включает в себя аппаратные часы, синхронизацию операционной системы и сетевые протоколы, работающие совместно. NTP обеспечивает точность часов по всей сети. Храните время в UTC с информацией о часовом поясе; используйте формат ISO 8601 для обмена данными. Помните о пограничных случаях — переходах на летнее время, секундах координации и проблеме 2038 года. В распределённых системах синхронизация часов — основа корректной работы.

Похожие статьи

Время в вычислительной технике: часы, метки времени и синхронизация | YounitConverter