Я знаю, что метка времени 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 .