Entry tags:
Как считать разницу во времени между двумя событиями?
Позор мне! Гугол не дал мне ответа на этот вопрос...
Суть проблемы: ни UNIX-time, ни юлианская дата не учитывают високосных секунд (юлианская дата еще и некоторых високосных дней не учитывает). Поэтому отняв время события А из времени события Б мы не получим реальной разницы во времени между ними.
Неужто нет такой сишной системной функции, которая это считает, используя tzdata и нужно парсить этот файл самому?
UPD. Решение было у меня под носом: это умеет libSOFA.
Суть проблемы: ни UNIX-time, ни юлианская дата не учитывают високосных секунд (юлианская дата еще и некоторых високосных дней не учитывает). Поэтому отняв время события А из времени события Б мы не получим реальной разницы во времени между ними.
Неужто нет такой сишной системной функции, которая это считает, используя tzdata и нужно парсить этот файл самому?
UPD. Решение было у меня под носом: это умеет libSOFA.
no subject
http://segfault.kiev.ua/~netch/articles/time-counting.html
Я не знаю, решит ли он твою проблему (он большой и я не помню его целиком), просто это самая объемная и подробная работа по учету времени в юникс-системах, которую я знаю.
Еще гугол что-то вроде бы недавно изобретал для коррекции leap seconds.
no subject
А еще, кстати, в следующем веке приведенной там формулой связи UNIX time и юлианских дней пользоваться нельзя будет.
В астрономии для трансформации координат используется LibSOFA или устаревшая (и вообще неподдерживаемая) SLAlib. Я без понятия, как вычисляются координаты в стеллариуме, но, судя по сравнению, вычисляются они правильно (как и в LibSOFA) — т.е. leap seconds там тоже учитываются (как и всякие DUT'ы и т.п.). А вот SLAlib уже дает погрешность примерно в 3''.
Во внутренности не влезал: там очень страшно ☺
Кстати, полез сейчас в документацию к libSOFA и нашел ответ на свой вопрос: dT = TAI2 - TAI1. А вычислить TAI можно при помощи той же libSOFA:
В переменных a1 и a2 будет находиться время TAI во "внутреннем формате". Думаю, исходники вполне помогут понять, как из этого "внутреннего формата" получить временнýю разницу.