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 не?

2 ответа

Решение

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

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

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

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

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

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

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

Здесь и в других местах ведется много дискуссий о дополнительных секундах, но это не сложная проблема, потому что она не имеет ничего общего с 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 для получения подробной информации обо всех современных реализациях.

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

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

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

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

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

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

Другие вопросы по тегам