Время Unix и дополнительные секунды

Что касается времени Unix (POSIX), Википедия говорит:

Из-за обработки дополнительных секунд он не является ни линейным представлением времени, ни истинным представлением UTC.

Но команда Unix date, похоже, на самом деле не знает о них

$ date -d '@867715199' --utc
Mon Jun 30 23:59:59 UTC 1997
$ date -d '@867715200' --utc
Tue Jul  1 00:00:00 UTC 1997

Хотя там на Mon Jun 30 23:59:60 UTC 1997 должна быть дополнительная секунда.

Означает ли это, что только команда date игнорирует дополнительные секунды, а концепция времени Unix - нет?


person Campa    schedule 14.05.2013    source источник
comment
Хороший обзор utc / tai можно найти на madore.org/~david /computers/unix-leap-seconds.html   -  person loreb    schedule 15.05.2013
comment
На этой странице объясняется, как операционные системы обрабатывают / должны обрабатывать информацию о секундах координации от ntp, meinbergglobal.com/english/info/leap-second.htm#os   -  person Silver Moon    schedule 28.01.2017
comment
Mon Jun 30 23:59:60 UTC 1997. не имеет смысла. Это неправильное время.   -  person Sebi2020    schedule 27.03.2021


Ответы (4)


Количество секунд в день фиксировано с помощью временных меток Unix.

Временное число Unix равно нулю в эпоху Unix и увеличивается ровно на 86400 в день с эпохи.

Таким образом, он не может представлять дополнительные секунды. ОС замедлит часы, чтобы приспособиться к этому. Что касается временных меток Unix, дополнительных секунд просто не существует.

person Thomas Jung    schedule 14.05.2013
comment
Разве это не определение оригинальной концепции времени Unix, или, во всяком случае, того, что в настоящее время является временем Unix на основе TAI, которое равно a pure linear count of seconds elapsed since 1970-01-01T00:00:00 TAI (а день TAI зафиксирован на 86400 с). ? - person Campa; 14.05.2013
comment
В любом случае, у дня 86400. Разница в том, игнорирует ли ваша система тот факт, что на орбите находится реальная Земля (т. Е. Фиксирует продолжительность дня). Второй случай - обычный. - person Thomas Jung; 14.05.2013
comment
Хорошо, но UTC не игнорирует орбиту Земли, и с одной стороны вы указываете, что время Unix фиксировано на 86400 с в день, но с другой стороны, и я цитирую, что время Unix обрабатывает дополнительные секунды. ? - person Campa; 15.05.2013
comment
Секунда unix может отличаться от реальной секунды. День unix состоит из 86400, что на самом деле составляет 86401 реальную секунду (для дней с дополнительными секундами). В противном случае часы идут вперед, как TAI: TAI опережает UTC ровно на 35 секунд. 35 секунд являются результатом начальной разницы в 10 секунд в начале 1972 года плюс 25 дополнительных секунд по всемирному координированному времени с 1972 года. - person Thomas Jung; 15.05.2013
comment
@ThomasJung, Ваш ответ вводит в заблуждение / неверен. 1) Время Unix может представлять и представляет дополнительные секунды, хотя и не однозначно. Например, UTC 1998-12-31 23: 59: 60.25 представлено как время Unix 915148800.25. Если бы количество секунд было зафиксировано с помощью временных меток Unix, у нас было бы 86400 уникальных целочисленных временных меток Unix в день, каждый день. Хотя метки времени Unix увеличиваются на 86400 в день, это не означает, что у нас есть 86400 секунд в метках времени Unix в день. Не каждое действительное число является действительной меткой времени Unix из-за отрицательных дополнительных секунд, и не все реальные. - person Pacerier; 16.06.2013
comment
..число - уникальная временная метка Unix из-за положительных дополнительных секунд. 2) Високосные секунды существуют в том, что касается временных меток Unix. Если они этого не сделали, время Unix замерзнет в течение секунды координации, а это не так. - person Pacerier; 16.06.2013
comment
@Campa: время TAI, как всегда, продолжает отсчитывать високосные секунды (каждая вставочная дополнительная секунда увеличивается на TAI - разница в формате UTC. Время POSIX - это время в формате UTC (за исключением моментов в течение дополнительных секунд). TAI может определять фактические прошедшие секунды в формате UTC (SI), POSIX - - UT (вращение Земли) секунд (поскольку UTC находится в пределах 0,9 секунды от UT). Чтобы найти фактическое количество секунд, прошедших между двумя событиями, указанными в UTC, вам необходимо знать соответствующее количество скачков для каждого события, например, 2010-01- 01 - 34 дополнительных секунды, 01.01.2013 - 35 дополнительных секунд. - person jfs; 15.09.2014
comment
@Pacerier: временная метка Unix не уникальна, если не используется сглаживание скачка или аналогичный метод. Посмотрите на переходы в стиле POSIX и Миллса. - person jfs; 15.09.2014
comment
@ Дж. Ф. Себастьян, я думаю, что вы @ не тот парень, потому что это именно то, что я сказал. - person Pacerier; 16.09.2014
comment
@Pacerier: извините. Я неправильно прочитал ваш второй комментарий. Я заметил в нем уникальную временную метку Unix и перестал читать. - person jfs; 16.09.2014
comment
@Pacerier: Можете ли вы предоставить ссылку, в которой указано, что время Unix представляет собой дополнительные секунды? На этой странице прямо сказано, что это не так: Однако во времени POSIX (секунды с начала эпохи) дополнительные секунды игнорируются (не применяются). На этой странице также говорится, что каждый день должен приходиться ровно на 86400 секунд. - person dreamlax; 30.10.2014
comment
@Pacerier: То, что вы процитировали, показывает, что одна и та же временная метка Unix используется как для 1998-12-31T23: 59: 60.00, так и для 1999-01-01T00: 00: 00.00 - person dreamlax; 30.10.2014
comment
@dreamlax, Одна и та же временная метка Unix должна использоваться как для 1998-12-31T23: 59: 60.00, так и для 1999-01-01T00: 00: 00.00. Перечитайте 2 пункта выше: время Unix может представлять и представляет дополнительные секунды, хотя и не однозначно. Что касается временных меток Unix, то високосные секунды существуют. Если они этого не сделали, время Unix замерзнет в течение секунды координации, чего не происходит. - person Pacerier; 30.10.2014
comment
@Jung: не могли бы вы перефразировать так, чтобы он не мог отображать високосные секунды однозначно? - person Campa; 23.04.2015
comment
Вот окончательный ответ из спецификации POSIX: pubs.opengroups.org/onlinepubs.org/onlinepubs.org/ / 9699919799 / xrat / Цитата: во времени POSIX (секунды с начала эпохи) дополнительные секунды игнорируются (не применяются) - person Kenton Varda; 12.06.2015
comment
@KentonVarda: прочтите комментарии над вашими - person jfs; 02.08.2015

Время Unix легко работать, но некоторые временные метки не являются реальным временем, а некоторые временные метки не уникальны.

То есть есть несколько повторяющихся меток времени, представляющих две разные секунды во времени, потому что в unix-time шестидесятой секунде, возможно, придется повторить себя (поскольку не может быть шестьдесят первой секунды). Теоретически они также могут быть пробелами в будущем, потому что шестидесятой секунды не должно быть, хотя до сих пор не было выпущено пропуска дополнительных секунд.

Обоснование unix time: оно определено так, чтобы с ним было легко работать. Добавить поддержку дополнительных секунд в стандартные библиотеки очень сложно. Например, вы хотите представить в базе данных 1 января 2050 года. Никто на земле не знает, сколько секунд до этой даты по всемирному координированному времени! Дата не может быть сохранена как отметка времени в формате UTC, потому что IAU не знает, сколько дополнительных секунд нам придется добавить в следующие десятилетия (они так же хороши, как и случайные). Итак, как программист может выполнять арифметику дат, если промежуток времени, который пройдет между любыми двумя датами в будущем, известен не раньше, чем годом или двумя раньше? Время в Unix простое: мы уже знаем временную метку на 1 января 2050 года (а именно, 80 лет * количество секунд в году). С UTC чрезвычайно сложно работать круглый год, тогда как со временем unix сложно работать только в тот момент, когда возникает дополнительная секунда.

Как бы то ни было, я никогда не встречал программиста, который соглашался бы с дополнительными секундами. Их явно следует отменить.

person Nicholas Wilson    schedule 14.05.2013
comment
Что вы имеете в виду, что работать с Unix-временем легко? На странице Википедии говорится, что the Unix time scale was originally intended to be a simple linear representation of time elapsed since an epoch, но затем комитет POSIX решил синхронизировать его с шкалой времени UTC, следовательно, с дополнительными секундами, если я правильно понимаю. ? - person Campa; 14.05.2013
comment
Нет, unix time никогда не имеет дополнительных секунд. Он синхронизирован с UTC, то есть время unix отсчитывается в тот же момент, что и такты UTC: у второго точно такая же длина, и они выстраиваются в линию. Иногда, когда время unix идет, его значение увеличивается на два, тогда как UTC увеличивается только на единицу. Время в Unix намного проще, чем любая система с дополнительными секундами, потому что дополнительные секунды - это полная шутка. - person Nicholas Wilson; 14.05.2013
comment
Извините, глупая ошибка в последнем комментарии. Третье предложение следует читать: Иногда, когда время unix идет, его значение повторяет предыдущую секунду, тогда как UTC увеличивается только на единицу. - person Nicholas Wilson; 14.05.2013
comment
Вы имеете в виду, что время Unix подтверждает високосные секунды повторением одного и того же тика, в то время как UTC использует 60-ю секунду? - person Campa; 15.05.2013
comment
@NicholasWilson. UTC 1 января 2050 года можно сохранить как отметку времени UTC прямо сейчас, хотя и не со 100% уверенностью. Високосные секунды не являются случайными (по крайней мере, согласно текущим знаниям), независимо от того, является ли мир недетерминированным. Если бы они были случайными, мы не смогли бы предсказать будущие временные метки UTC выше почти нулевого показателя успеха, но мы можем. - person Pacerier; 16.06.2013
comment
@Pacerier ОК, так что 1 января 2050 года, 00:00:00 - 2524629600. Какая для этого отметка времени в формате UTC? Никто не знает. Это большая проблема для программистов: либо вы пишете много кода, либо делаете действительно небрежное программирование (что может быть даже незаконным, в зависимости от правил, которым должно соответствовать программное обеспечение). Високосные секунды так же хороши, как и случайные, в том смысле, что мы не знаем, когда они наступят. У нас нет моделей, которые точно предсказывают колебание Земли, нам просто нужно ждать и наблюдать каждый год. Конечно, это детерминировано, но это не поможет ни программистам, ни IAU. - person Nicholas Wilson; 17.06.2013
comment
@NicholasWilson, нам не нужно писать много кода или заниматься небрежным программированием. Позвольте мне повторить: високосные секунды не являются случайными (по крайней мере, согласно текущим знаниям), независимо от того, является ли мир недетерминированным или нет. Если бы они были случайными, мы не смогли бы предсказать будущие временные метки UTC выше почти нулевого показателя успеха, но мы можем. Что это значит, если бы они были случайными, мы бы не знали, сколько дополнительных секунд произойдет завтра или даже сегодня. Несмотря на то, что у нас нет полной информации, у нас есть некоторая информация, и поэтому дополнительные секунды равны ... - person Pacerier; 21.06.2013
comment
..... не случайный. Это не похоже на rand(), и о, у нас есть дополнительная секунда, rand(), и о, у нас нет. UTC - не большая проблема для программистов. Это большая проблема только для программистов, которые не учитывают это или используют его, не понимая этого. Как и все остальное, это является большой проблемой, независимо от того, UTC это или нет. - person Pacerier; 21.06.2013
comment
Похоже, вы зациклились на том, что отметка времени должна отражать количество секунд, хотя на самом деле goo.gl/QWsOo отметка времени - это просто последовательность символов или закодированной информации. Другими словами, строка 1 января 2050 года, 00:00:00 является на самом деле меткой времени в формате UTC, если мы можем декодировать ее по времени 1 января 2050 года, 00:00:00. Если вам не нравятся буквенно-цифровые символы, мы всегда можем преобразовать их в любое целое число с произвольной кодировкой, например 2498729866093, и это по-прежнему метка времени в формате UTC, пока получатель ........ - person Pacerier; 21.06.2013
comment
...... может декодировать его по времени UTC, даже если закодированная информация не отражает напрямую количество прошедших секунд. - person Pacerier; 21.06.2013
comment
@ J.F. Себастьян, это именно то, что я сказал. Мы не знаем со 100% уверенностью, сколько секунд мы будем отключены, но мы знаем, что гарантированно находимся в диапазоне 50 секунд, или 25 секунд, или 10 секунд, или 5 секунд и т. д. - person Pacerier; 16.09.2014
comment
@ J.F.Sebastian, для случайного шара мы не можем угадать меньший диапазон, чем возможный диапазон. Но поскольку високосные секунды не случайны (примерно, мы получаем 1 положительную високосную секунду за ~ 1,5 года), мы можем предположить меньший диапазон, чем возможный диапазон. Простой эксперимент: сколько секунд прыжка будет с 2050 до 2150? Ответ: 100 / 1,5 = ~ 66,6 секунд прыжка положительный и ~ 0 секунд прыжка отрицательный. Теперь, если бы високосные секунды были случайными один раз в год (IERS делает это дважды в год), ответ был бы 33,3 положительных и 33,3 отрицательных. Больной............................................... .. - person Pacerier; 17.09.2014
comment
.......................... ставим вам 10 лет зарплаты, что у нас не будет почти 33 отрицательных дополнительных секунд в пределах от 2050 до 2150. Вы думаете, что это совпадение, что у нас (2011-1972) /1,5 = 26 дополнительных секунд с 1972 по 2011 год? Нет, поскольку скорость вращения Земли изменяется неслучайно, это было так с давних времен, и именно так ученые оценивают, что в течение длительного периода мы получим 1 високосная секунда за ~ 1,5 года для текущей эпохи. - person Pacerier; 17.09.2014
comment
@ J.F.Sebastian, случайность не означает то, что вы думаете. Хотя вы можете определять случайное значение, как вам нравится, когда я говорю «случайный», я имею в виду случайное значение, определенное Брюсом Шнайером: результаты, которые непредсказуемы и не могут быть надежно воспроизведены. Согласно этому определению, это определенно означает ~ 33,3 положительных и ~ 33,3 отрицательных секунды за значительный промежуток времени из-за LLN. Границы бокса не подлежат обсуждению, так как они уже ..................................... ........................................... ‌ ..... ........................ - person Pacerier; 30.10.2014
comment
..................................... предварительно установлено IERS: от 0 до 2 положительных / отрицательных високосных секунд в год, не больше и не меньше. В наборе {(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (2, 0)} ровно 6 элементов, и из-за LLN, определение random, предоставленное Брюсом Шнайером, требует, чтобы каждый член в наборе встречался одинаковое количество раз, другой член. Тот факт, что до сих пор не было введено никаких отрицательных секунд, доказывает, что, вероятно, результаты являются неслучайными, что подтверждает мою позицию. - person Pacerier; 30.10.2014
comment
@ J.F.Sebastian, вы можете начать с первой обнаруженной ошибки. А может, нет ни одной ошибки, о которой можно было бы говорить? - person Pacerier; 30.10.2014
comment
Я удалил свои комментарии. Ты победил. Если вы хотите учиться, начните с изучения распределения вероятностей. - person jfs; 30.10.2014
comment
Разве типичная система Unux не будет игнорировать дополнительную секунду и просто замедлить свои часы, когда обнаружит, что она опережает NTP-сервер, с которым она связана? В этом случае никогда не бывает неоднозначной отметки времени, только какое-то время неточной. - person Mark Ransom; 29.03.2018
comment
Да, это очевидная реализация. С неприятным последствием, что в течение многих минут каждый год (пока происходит поворот часов) часы вашего компьютера на сотни миллисекунд не синхронизируются с гражданским временем. Приложения, которым нужна устойчивая секундная стрелка, терпят поражение (хотя они, конечно, должны использовать монотонные часы), а приложения, которым требуется точное гражданское время, терпят поражение. Но разумной альтернативы нет ... Вывод: игнорируете ли вы или учитываете дополнительные секунды, они просто плохи. - person Nicholas Wilson; 30.03.2018

Здесь и в других местах много обсуждают дополнительные секунды, но это не сложная проблема, потому что она не имеет ничего общего с UTC, GMT, UT1, TAI или любым другим стандартом времени. Время POSIX (Unix) по определению определяется стандартом IEEE Std 1003.1 "POSIX", доступен здесь.

Стандарт однозначен: время POSIX не включает дополнительные секунды.

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

Стандарт подробно описывает важные детали, недвусмысленно заявляя, что время POSIX не включает дополнительные секунды, в частности:

Практически невозможно предписать, чтобы соответствующая реализация имела фиксированное отношение к каким-либо конкретным официальным часам (рассмотрите изолированные системы или системы, выполняющие «повторы», устанавливая часы на некоторое произвольное время).

Поскольку дополнительные секунды определяются комитетом, включение дополнительных секунд в POSIX-время - это не просто «плохая идея», это невозможно, учитывая, что стандарт допускает соответствующие реализации, не имеющие доступа к сети.

В другом месте в этом вопросе @Pacerier сказал, что время POSIX включает в себя дополнительные секунды, и что каждое время POSIX может соответствовать более чем одному времени UTC. Хотя это, безусловно, одна из возможных интерпретаций метки времени POSIX, это ни в коем случае не указано в стандарте. Его аргументы в основном сводятся к ласковым словам, неприменимым к стандарту, определяющему время POSIX.

Теперь все становится сложнее. Как указано в стандарте, время POSIX может не соответствовать времени UTC:

Поэтому время POSIX с разбивкой по шкале не обязательно является временем в формате UTC, несмотря на его внешний вид.

Однако на практике это так. Чтобы понять суть проблемы, вы должны понимать стандарты времени. GMT и UT1 основаны на астрономическом положении Земли во Вселенной. TAI основан на фактическом количестве времени, которое проходит во Вселенной, которое измеряется физическими (атомными) реакциями. В TAI каждая секунда - это «секунда SI», которые имеют одинаковую длину. В UTC каждая секунда является секундой в системе СИ, но при необходимости добавляются дополнительные секунды, чтобы вернуть часы в пределах 0,9 секунды от GMT / UT1. Стандарты времени GMT и UT1 определены эмпирическими измерениями положения и движения Земли во Вселенной, и эти эмпирические измерения не могут быть предсказаны никакими средствами (ни научной теорией, ни приближением). Таким образом, дополнительные секунды также непредсказуемы.

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

Используя очевидную лазейку в стандарте POSIX, реализации намеренно замедляют или ускоряют секунды, чтобы время POSIX больше не использовало секунды SI, чтобы оставаться синхронизированными со временем UTC. При чтении стандарта становится ясно, что это было не то, что было задумано, потому что это невозможно сделать с изолированными системами, которые, следовательно, не могут взаимодействовать с другими машинами (их временные метки без дополнительных секунд означают что-то другое для других машин с дополнительными секундами). Читать:

[...] важно, чтобы интерпретация названий времени и секунд с момента значений эпохи была согласованной во всех соответствующих системах; то есть важно, чтобы все соответствующие системы интерпретировали «536457599 секунд с эпохи» как 59 секунд, 59 минут, 23 часа 31 декабря 1986 года, независимо от точности представления системы о текущем времени. Выражение дано для обеспечения последовательной интерпретации, а не для попытки указать календарь. [...] Эта неуказанная секунда номинально равна секунде Международной системы (СИ) по продолжительности.

«Лазейка», позволяющая такое поведение:

Обратите внимание, что как практическое следствие этого длина секунды, измеренная каким-либо внешним стандартом, не указывается.

Таким образом, реализации злоупотребляют этой свободой, намеренно изменяя ее на то, что по определению не может взаимодействовать между изолированными или не участвующими системами. В качестве альтернативы реализация может просто повторять POSIX раз, как если бы время не прошло. См. этот ответ Unix StackExchange для получения подробной информации обо всех современных реализациях.

Фух, это сбивало с толку ... Настоящая головоломка!

person Community    schedule 15.10.2019
comment
Вы имеете в виду, что в UTC каждая секунда - это секунда в системе СИ, но дополнительные секунды вычитаются * по мере необходимости ... - person Carlo Wood; 27.01.2021

Поскольку оба других ответа содержат много вводящей в заблуждение информации, я добавлю это.

Томас прав в том, что количество секунд временной метки Unix Epoch в день фиксировано. Это означает, что в дни, когда есть дополнительная секунда, секунда непосредственно перед полуночью (61-я секунда минуты по всемирному координированному времени перед полуночью) получает ту же метку времени, что и предыдущая секунда.

Эта временная метка "воспроизводится", если хотите. Таким образом, одна и та же временная метка unix будет использоваться для двух секунд реального мира. Это также означает, что если вы получаете дробные эпохи unix, вся секунда будет повторяться.

X86399.0, X86399.5, X86400.0, X86400.5, X86400.0, X86400.5, затем X86401.0.

Таким образом, время unix не может однозначно представлять дополнительные секунды - временная метка дополнительной секунды также является меткой времени предыдущей реальной секунды.

person B T    schedule 01.01.2019
comment
Это также означает, что фраза о количестве секунд, прошедших с начала эпохи, вводит в заблуждение. Это НЕ S.I. секунды, а некоторые виды загадочных и не совсем точно определенных секунд POSIX, длина которых изменяется по мере того, как применяется больше дополнительных секунд (более или менее случайно). - person Carlo Wood; 27.01.2021