Что на самом деле отслеживают временные метки Unix?

Я знаю, что временная метка Unix определяется как количество секунд, прошедших с 1970-01-01 00:00:00Z. Однако я не мог найти ясного источника, который дает это определение. Я также читал различные заявления о взаимосвязи между UTC и отметкой времени Unix в отношении секунд прыжка.

Эта страница википедии содержит список всех секунд прыжка. Первый

1972-06-30 23:59:60

Заявления о временных отметках Unix

Что касается "всех современных компьютерных систем", время Unix совершенно не знает ни о чем, кроме секунд.

Источник: HackerNews, брази

UNIX - это временные треки UTC вместо TAI, что означает, что он "исправляет" для секунд прыжка. В результате UNIX-время не "количество секунд с эпохи", а "86400 * (количество целых дней с эпохи) + (количество секунд с полуночи)", а время UNIX будет идти вперед (никогда до сих пор) и назад на секундах прыжка (вторая будет повторяться в большинстве реализаций, так как день идет от 23:59:60 до 00:00:00, так как у них одинаковая метка времени).

Источник: Hacker News, масклинн

Я также читал (но я не могу найти его снова - где-то на переполнении стека), что временные метки Unix предполагают, что каждый день имеет ровно 24 * 60 * 60 секунд. Плакат подразумевал, что дни все еще сохраняются синхронно, в то время как секунды прыжка просто "замедляют" реальную секунду. Следовательно, "временная отметка времени unix" может не быть секундой SI.

Возможные ответы

Я вижу три возможных ответа:

A1: Временные метки Unix отслеживают SI секунд с 1970-01-01 00: 00: 00Z. Это означает, что они 27 секунд от UTC.

A2: Временные метки Unix отслеживают "пройденные секунды в TAI". Это означает, что библиотека, которая преобразует временные метки Unix в UTC, должна иметь дело со скачкообразными секундами.

A3: Временные метки Unix отслеживают "пройденные секунды в UTC". Это означает, что разница между двумя временными метками Unix 1 может быть 1 SI-секундой в большинстве случаев, но не во всех.

Пожалуйста, добавьте источник в свой ответ.

питон

Кажется, что Python datetime не знает о секундах прыжка (?).

>>> import datetime
>>> a = datetime.datetime(1972, 6, 30, 23, 59, 59)
>>> b = datetime.datetime(1972, 7, 1, 0, 0, 0)
>>> b-a
datetime.timedelta(0, 1)

и модуль time похоже, отображает фактический прыжок второй на секунду раньше:

>>> import time
>>> t3 = time.mktime((1972, 6, 30, 23, 59, 59, -1, -1, -1))
>>> t4 = time.mktime((1972, 7, 1, 0, 0, 0, -1, -1, -1))
>>> t4 - t3
1.0
>>> t4 = time.mktime((1972, 6, 30, 23, 59, 60, -1, -1, -1))
>>> t4 - t3
1.0

Это впечатление поддерживается issue23574.

Ответы

Ответ 1

A.4.16 секунд со времен Эпохи

Скоординированное универсальное время (UTC) включает в себя секунды прыжка. Тем не менее, в POSIX время (секунды с эпохи), прыжки секунд игнорируются (не применяются), чтобы обеспечить простой и совместимый метод вычисления разницы во времени. Следовательно, время POSIX с нарушенным временем не обязательно UTC, несмотря на его внешний вид. [...]

В большинстве систем понятие "время" - это значение постоянно растущего значения, поэтому это значение должно увеличиваться даже во время прыжковых секунд. Однако не только большинство систем не отслеживают секунды прыжка, но большинство систем, вероятно, не синхронизированы с какой-либо стандартной ссылкой на время. Поэтому неуместно требовать, чтобы время, представляемое в виде секунд, так как Эпоха точно отражает количество секунд между указанным временем и Эпохой.

Достаточно требовать, чтобы приложениям разрешалось обрабатывать это время, как если бы оно представляло количество секунд между указанным временем и эпохой. Ответственность поставщика и администратора системы лежит на обеспечении того, чтобы это значение представляло количество секунд между указанным временем и Эпохой настолько близко, насколько это необходимо для приложения, запущенного в этой системе.

Источник: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap04.html#tag_21_04_16