Здесь и в других местах много обсуждают дополнительные секунды, но это не сложная проблема, потому что она не имеет ничего общего с 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
Mon Jun 30 23:59:60 UTC 1997.
не имеет смысла. Это неправильное время. - person Sebi2020   schedule 27.03.2021