Что на самом деле отслеживает метки времени Unix? - PullRequest
0 голосов
/ 09 сентября 2018

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

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

1972-06-30 23:59:60

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

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

Источник: HackerNews, Brazzy

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

Источник: Hacker News, masklinn

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

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

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

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 Ответ

0 голосов
/ 09 сентября 2018

A.4.16 Секунды с начала эпохи

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

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

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

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

...