#java #java.time.instant #leap-second
#оболочка #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 — нет?
Комментарии:
1. Есть хороший обзор utc / tai в madore.org /~david/computers/unix-leap-seconds.html
2. На этой странице объясняется, как операционные системы обрабатывают / должны обрабатывать информацию о високосных секундах из ntp, meinbergglobal.com/english/info/leap-second.htm#os
3.
Mon Jun 30 23:59:60 UTC 1997.
не имеет смысла. Это недопустимое время.4. Информация о часовом поясе IANA: iana.org/time-zones Текущий список високосных секунд IETF raw.githubusercontent.com/eggert/tz/main/leap-seconds . список Осторожно! Шестнадцатеричный хэш SHA-1 в этом файле пропускает начальные нули.
Ответ №1:
Количество секунд в день фиксируется с помощью временных меток Unix.
Число времени Unix равно нулю в эпоху Unix и увеличивается ровно на 86400 в день, начиная с эпохи.
Поэтому он не может представлять високосные секунды. ОС замедлит часы, чтобы приспособиться к этому. Високосные секунды просто не существуют в отношении временных меток Unix.
Комментарии:
1. Секунда unix может отличаться от «реальной» секунды. День unix имеет 86400s, которые на самом деле 86401 реальных секунд (для дней с високосными секундами). В противном случае часы опережают, как TAI: TAI опережает UTC ровно на 35 секунд. 35 секунд являются результатом начальной разницы в 10 секунд в начале 1972 года плюс 25 високосных секунд по UTC с 1972 года.
2. @ThomasJung, ваш ответ вводит в заблуждение / неверен. 1) Время Unix может представлять и представляет високосные секунды, хотя и не однозначно. Например, UTC 1998-12-31 23:59:60.25 представлено как время Unix 915148800.25. Если бы количество секунд было фиксировано с помощью временных меток Unix, у нас было бы 86400 уникальных целых временных меток Unix в день, каждый день. Хотя временные метки Unix увеличиваются на 86400 в день, это не означает, что у нас есть 86400 секунд в временных метках Unix в день. Не каждое действительное число является допустимой меткой времени Unix из-за отрицательных високосных секунд, и не каждое действительное..
3. ..число — это уникальная временная метка Unix из-за положительных високосных секунд. 2) Високосные секунды существуют, насколько это касается временных меток Unix. Если они этого не сделали, время Unix остановится во время високосной секунды, чего не происходит.
4. @Campa: время TAI продолжает отсчитываться в течение високосных секунд, как всегда (каждая промежуточная високосная секунда увеличивает разницу между TAI и UTC . Время POSIX — это время UTC (исключая моменты во время високосных секунд). TAI может указывать фактические истекшие секунды UTC (SI), секунды POSIX — UT (вращение Земли) (поскольку UTC находится в пределах 0,9 секунды от UT). Чтобы найти фактическое количество секунд, прошедших между двумя событиями, указанными в UTC, вам необходимо знать соответствующее количество прыжков в каждом событии, например, 2010-01-01 — 34 секунды прыжка, 2013-01-01 — 35 секунд прыжка.
5. Вот окончательный ответ из спецификации POSIX: pubs.opengroup.org/onlinepubs/9699919799/xrat / … Цитата: «во время POSIX (секунды с момента начала эпохи) високосные секунды игнорируются (не применяются)»
Ответ №2:
Со временем Unix легко работать, но некоторые временные метки не являются реальными временами, а некоторые временные метки не являются уникальными временами.
То есть, есть несколько повторяющихся временных меток, представляющих две разные секунды по времени, потому что во времени unix шестидесятая секунда может повторяться (поскольку не может быть шестьдесят первой секунды). Теоретически, они также могут быть пробелами в будущем, потому что шестидесятая секунда не должна существовать, хотя до сих пор не было выпущено никаких пропусков високосных секунд.
Обоснование времени unix: оно определено так, чтобы с ним было легко работать. Добавить поддержку високосных секунд в стандартные библиотеки очень сложно. Например, вы хотите представить 1 января 2050 года в базе данных. Никто на земле не знает, сколько секунд отделяет эту дату от UTC! Дата не может быть сохранена как временная метка UTC, потому что IAU не знает, сколько високосных секунд нам придется добавить в ближайшие десятилетия (они так же хороши, как случайные). Итак, как программист может выполнять арифметику даты, когда промежуток времени, который пройдет между любыми двумя датами в будущем, неизвестен до года или двух раньше? Время Unix просто: мы уже знаем временную метку 1 января 2050 года (а именно, 80 лет * # секунд в году). С UTC чрезвычайно сложно работать круглый год, тогда как со временем unix сложно работать только в момент наступления високосной секунды.
Как бы то ни было, я никогда не встречал программиста, который согласен с високосными секундами. Их явно следует отменить.
Комментарии:
1. Нет, время unix никогда не имеет високосных секунд. Оно синхронизируется с UTC, то есть время unix отсчитывается в тот же момент, что и UTC: секунда имеет точно такую же длину, и они выстраиваются в линию. Иногда, когда время unix отсчитывается, его значение увеличивается на два, тогда как UTC увеличивается только на единицу. Время Unix намного, намного проще, чем любая система с високосными секундами, потому что високосные секунды — это полная шутка.
2. Извините, глупая ошибка в последнем комментарии. Третье предложение должно гласить: «Иногда, когда время unix отсчитывается, хотя его значение повторяет предыдущую секунду, тогда как UTC увеличивается только на единицу».
3. @Pacerier ХОРОШО, итак, 1 января 2050 года, 00:00:00 равно 2524629600. Какая временная метка UTC для этого? Никто не знает. Это большая проблема для программистов: либо вы пишете много кода, либо выполняете действительно неаккуратное программирование (которое может быть даже незаконным, в зависимости от каких-либо правил, которым должно соответствовать программное обеспечение). Високосные секунды так же хороши, как случайные, поскольку мы не знаем, когда они наступят. У нас нет никаких моделей, которые точно предсказывают колебания земли, нам просто нужно подождать и посмотреть каждый год. Конечно, это детерминировано, но это не поможет ни программистам, ни IAU.
4. Я удалил свои комментарии. Вы выиграли. Если вы хотите научиться, начните с изучения распределений вероятностей.
5. Разве типичная система Unux не будет не знать о високосной секунде и просто замедлит свои часы, когда обнаружит, что они опережают сервер NTP, с которым он связан? В этом случае никогда не бывает неоднозначных временных меток, только неточные на некоторое время.
Ответ №3:
Здесь и в других местах много обсуждается високосные секунды, но это не сложный вопрос, потому что он не имеет ничего общего с 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 каждая секунда является «секундой СИ», и все они имеют одинаковую длину. В UTC каждая секунда равна секунде СИ, но високосные секунды добавляются по мере необходимости, чтобы перенастроить часы обратно с точностью до 0,9 секунды по Гринвичу / UT1. Стандарты времени GMT и UT1 определяются эмпирическими измерениями положения и движения Земли во Вселенной, и эти эмпирические измерения никакими средствами (ни научной теорией, ни приближением) нельзя предсказать. Таким образом, високосные секунды также непредсказуемы.
Теперь стандарт POSIX также указывает, что намерение состоит в том, чтобы все временные метки POSIX были совместимыми (означают одно и то же) в разных реализациях. Одно из решений состоит в том, чтобы все согласились с тем, что каждая секунда POSIX равна одной секунде SI, и в этом случае время POSIX эквивалентно TAI (с указанной эпохой), и никому не нужно ни с кем связываться, кроме своих атомных часов. Однако мы этого не сделали, вероятно, потому, что хотели, чтобы временные метки POSIX были временными метками UTC.
Используя очевидную лазейку в стандарте POSIX, реализации намеренно замедляют или ускоряют секунды, чтобы время POSIX больше не использовало секунды SI, чтобы оставаться синхронизированным со временем UTC. Читая стандарт, становится ясно, что это было не то, что предполагалось, потому что это невозможно сделать с изолированными системами, которые поэтому не могут взаимодействовать с другими машинами (их временные метки без високосных секунд означают что-то другое для других машин с високосными секундами). Читать:
[…] важно, чтобы интерпретация названий времени и секунд, начиная со значений эпохи, была согласованной во всех соответствующих системах; то есть важно, чтобы все соответствующие системы интерпретировали «536457599 секунд с начала эпохи» как 59 секунд, 59 минут, 23 часа 31 декабря 1986 года, независимо от точностипредставление системы о текущем времени. Выражение задается для обеспечения согласованной интерпретации, а не для попытки указать календарь. […] Эта неопределенная секунда номинально равна секунде международной системы (SI) по продолжительности.
«Лазейка», допускающая такое поведение:
Обратите внимание, что как практическое следствие этого, длина секунды, измеряемая каким-либо внешним стандартом, не указана.
Таким образом, реализации злоупотребляют этой свободой, намеренно изменяя ее на что-то, что по определению не может быть совместимым между изолированными или не участвующими системами. В качестве альтернативы, реализация может просто повторять POSIX раз, как если бы время не прошло. Смотрите Этот ответ Unix StackExchange для получения подробной информации обо всех современных реализациях.
Фух, это сбивало с толку… Настоящая головоломка!
Комментарии:
1. Вы имеете в виду «В UTC каждая секунда равна секунде СИ, но високосные секунды вычитаются * по мере необходимости …»
Ответ №4:
Поскольку оба других ответа содержат много вводящей в заблуждение информации, я добавлю это.
Томас прав, что количество секунд временных меток эпохи Unix в день фиксировано. Это означает, что в дни, когда есть високосная секунда, секунда непосредственно перед полуночью (61-я секунда минуты UTC до полуночи) присваивается та же временная метка, что и предыдущая секунда.
Эта временная метка «воспроизводится», если хотите. Таким образом, одна и та же временная метка unix будет использоваться для двух реальных секунд. Это также означает, что если вы получаете дробные эпохи unix, вся секунда будет повторяться.
X86399.0
, X86399.5
, X86400.0
, X86400.5
, X86400.0
, X86400.5
, тогда X86401.0
.
Таким образом, время unix не может однозначно представлять високосные секунды — временная метка високосной секунды также является временной меткой для предыдущей реальной секунды.
Комментарии:
1. Это также означает, что фраза «количество секунд с момента начала эпохи» крайне вводит в заблуждение. Это НЕ S.I. секунды, а некоторые виды таинственных и не совсем точно определенных «секунд POSIX», длина которых меняется по мере применения большего количества високосных секунд (более или менее случайным образом).
2. @CarloWood это секунды с 1970 года. При этом секунда определяется как ровно 1/86400 дня. Чтобы получить точные секунды с 1970 года в секундах системы СИ, вам нужно будет добавить обратно високосные секунды, определенные UTC. Это не так сложно понять.
3. @Gellweiler Я это прекрасно понимаю: P. Я просто уточнял, что, когда они говорят «количество секунд с начала эпохи», они не говорят о реальных (S.I.) секундах, а просто возвращают «количество (дробных) дней, умноженных на 86400», что не дает реального количества секунд, поскольку некоторые дни равны 86401 секундам. Но да, если вы точно знаете, когда были добавлены високосные секунды, вы можете исправить результат — так что в прошлом они не были «загадочными». Они вроде как на будущее, потому что я не думаю, что это высечено в камне, когда високосные секунды будут добавлены на всю вечность.
4. Меня всегда расстраивает, когда кто-то говорит: «Это не так сложно понять», когда они не видят сложностей в теме.
5. этот ответ согласуется с: «увеличьте системные часы в течение високосной секунды и переведите часы на одну секунду назад в конце високосной секунды. Это подход, используемый POSIX» — eecis.udel.edu /~mills/leap.html