Хабрахабр

[Перевод] Заблуждения программистов о Unix-времени

Приношу извинения Патрику МакКензи.

Вчера Дэнни поинтересовался любопытными фактами о Unix-времени, а я вспомнил, что иногда оно работает совершенно неинтуитивно.

Вот эти три факта кажутся в высшей степени разумными и логичными, не так ли?

  1. Время Unix — это количество секунд с 1 января 1970 года 00:00:00 UTC.
  2. Если подождать ровно одну секунду, то время Unix изменится ровно на одну секунду.
  3. Время Unix никогда не двигается назад.

Всё это неправда.
Но недостаточно просто заявить «Всё это неправда», не объяснив, почему. Объяснения см. ниже. Но если хотите сами подумать, не прокручивайте изображение часов!

Собрано Джоном Леру.
Настольные часы 1770-х годов. Опубликовано под лицензией CC BY Из коллекции Wellcome.

Если вы не знакомы с дополнительными секундами, вот краткая справка: У всех трёх заблуждений одна причина: високосные секунды.

Время UTC определяется двумя факторами:

  • Международное атомное время: усреднённые показания сотен атомных часов по всему миру. Мы можем измерить секунду по электромагнитным свойствам атома, и это самое точное измерение времени, известное науке.
  • Всемирное время, основанное на вращении Земли вокруг собственной оси. Один полный оборот — одни сутки.

Проблема в том, что эти два числа не всегда совпадают. Вращение Земли не является последовательным — оно постепенно замедляется, поэтому сутки во Всемирном времени становятся длиннее. С другой стороны, атомные часы дьявольски точны и постоянны в течение миллионов лет.

С 1972 года служба IERS (которая управляет этим делом) добавила 27 дополнительных секунд. Когда два времени выпадают из синхрона, в UTC добавляется или удаляется секунда, чтобы вернуть синхронизацию. Теоретически возможно появление суток продолжительностью 86 399 секунд (минус одна). В результате получилось 27 суток UTC продолжительностью в 86 401 секунду. Оба варианта противоречат фундаментальному предположению о Unix-времени.

Если происходит такой скачок, то время Unix либо перепрыгивает через секунду, либо отсчитывая две секунды за одну. Время Unix предполагает, что каждый день длится ровно 86 400 секунд (60 × 60 × 24 = 86 400), без всяких дополнительных секунд. По состоянию на 2019 год в нём отсутствует 27 високосных секунд.

Так что наши заблуждения нужно дополнить следующим образом:

  • Время Unix — это количество секунд с 1 января 1970 00:00:00 UTC минус високосные секунды.
  • Если подождать ровно одну секунду, время Unix изменится ровно на одну секунду, если не была удалена дополнительная секунда.

    В этом случае последняя секунда UTC (23:59:59) отбрасывается. До сих пор на практике секунды никогда не удалялись (и замедление вращения Земли означает, что это маловероятно), но если бы это когда-либо произошло, это означало бы, что день UTC стал на одну секунду короче.

    Вот как это выглядит, в интервалах по четверти секунды: В каждых сутках Unix одинаковое количество секунд, поэтому последняя Unix-секунда укороченного дня не будет соответствовать никакому времени UTC.

    Если стартовать в 23:59:58:00 UTC и подождать одну секунду, время Unix продвинется на две секунды UTC, а метка времени Unix 101 никому не назначается.

  • Время Unix никогда не может вернуться назад, пока не добавлена дополнительная секунда.

    По окончании суток UTC добавляют дополнительную секунду 23:59:60. Это уже 27 раз произошло на практике. Вот как это выглядит, в интервалах по четверти секунды: В сутках Unix одинаковое количество секунд, поэтому он не может добавить дополнительную секунду — вместо этого приходится повторять метки времени Unix для последней секунды.

    50 и подождать полсекунды, время Unix возвращается на полсекунды, а метка времени Unix 101 соответствует двум секундам UTC. Если стартовать в 23:59:60.

Вероятно, это не единственные странности времени Unix — только то, что я вчера вспомнил.

Время — очень странная штука.

Теги
Показать больше

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть