Pull to refresh

Что должен знать о времени каждый программист

Reading time 3 min
Views 95K
Original author: Emil Mikulic

Некоторые замечания о времени

  • UTC: время на нулевом меридиане называется Всемирное координированное время, Universal Coordinated Time. Несовпадение акронима было вызвано необходимостью универсальности его для всех языков.
  • GMT: ранее вместо UTC использовалось среднее время по Гринвичу (Greenwich Mean Time, GMT), так как нулевой меридиан был выбран так, чтобы проходить через Гринвичскую королевскую обсерваторию.
  • Прочие часовые пояса могут быть записаны как смещение от UTC. Например, Австралийское восточное стандартное время (EST) записывается как UTC+1000, то есть время 10:00 по UTC есть 20:00 по EST того же дня.
  • Летнее время не влияет на UTC. Это всего лишь политическое решение смены часового пояса (смещения от UTC). Например, GMT всё ещё используется: это британское национальное время зимой. Летом оно становится BST.
  • Високосные секунды: по международному соглашению, UTC держится в не более чем 0,9 секунды от физической реальности (UT1, которое измеряется по солнечному времени) путём введения «високосной секунды» в конце последней минуты года по UTC или последней минуты июня.
  • Високосные секунды не обязаны объявляться (астрономами) более чем за 6 месяцев до их введения. Это представляет собой проблему, если вам требуется какое-либо планирование с секундной точностью на протяжении более 6 месяцев.
  • Время Unix: измеряется количеством секунд, прошедших с «эпохи» (начало 1970 года по UTC). На время Unix не оказывают влияния часовые пояса или летнее время.
  • Согласно стандарту POSIX.1, для времени Unix предполагается обрабатывать високосную секунды путём повторения предыдущей секунды, например:
        59.00
        59.25
        59.50
        59.75
        59.00 ← повтор
        59.25
        59.50
        59.75
        00.00 ← инкремент
        00.25
    Это компромисс: вы не можете как-либо выразить високосную секунду в ваших системных часах и ваше время гарантированно пойдёт в обратную сторону. С другой стороны, каждый день равен в точности 86 400 секундам, и вам не понадобится таблица всех прошлых и будущих високосных секунд для того, чтобы перевести Unix-время в удобную для человека форму часы-минуты-секунды.
  • Предполагается, что ntpd произведёт повтор после того, как получит «високосные биты» от вышестоящих серверов времени, но я также видел и то, как он не делает ничего: система переходит на одну секунуду в будущее, затем медленно сползает обратное на правильное время.

Что должен знать о времени каждый программист

  • Часовые пояса относятся к уровню презентации
    Большинство вашего кода не должно заниматься часовыми поясами или местным временем, оно должно передавать Unix-время как оно есть.
  • Когда измеряете время, измеряйте Unix-время. Это UTC. Его просто получить (системными функциями). Оно не имеет часовых поясов или летнего времени (и високосных секунд).
  • Когда храните время, храните Unix-время. Это одно число.
  • Если вы хотите сохранить время, пригодное для чтения человеком (например, в логах), постарайтесь сохранить его вместе с Unix-временем, а не вместо.
  • Когда отображаете время, всегда включайте в него смещение часового пояса. Формат времени без смещения бесполезен.
  • Системные часы не точны.
  • Вы в сети? Системные часы каждой другой машины не точны по-разному.
  • Системные часы могут, и будут, перепрыгивать вперёд и назад во времени из-за вещей, которые вне вашего контроля. Ваша программа должна быть разработана таким образом, чтобы пережить это.
  • Отношение количества секунд системных часов к количеству настоящих секунд — не точно и может меняться. В основном это зависит от температуры.
  • Не используйте слепо gettimeofday(). Если вам нужны монотонные (постоянно увеличивающиеся) часы, посмотрите на clock_gettime(). [Вариант для Java: вместо System.currentTimeMillis() используйте System.nanoTime()]
  • ntpd может изменять системное время двумя способами:
    • Шаг: часы перескакивают вперёд или назад к правильному времени немедленно
    • Подкручивание: изменение частоты системных часов так, чтобы они медленно сдвигались в сторону правильного времени.
    Подкручивание более предпочтительно, потому что оно менее разрушительно, но полезно только для корректировки небольшой разницы.

Специальные случаи

  • Время проходит со скоростью одну секунду за секунду для всех наблюдателей. Частота удалённых часов по отношению к наблюдателю зависит от скорости и гравитации. Часы внутри спутников GPS регулируются для преодоления эффектов относительности.
  • MySQL хранит столбцы типа DATETIME в виде упакованных в числа значений «YYYYMMDD HHMMSS» Если вы озаботились хранением отметок времени, храните их как целое число и используйте для преобразования функции UNIX_TIMESTAMP() и FROM_UNIXTIME().
Tags:
Hubs:
+224
Comments 100
Comments Comments 100

Articles