eddy_em: (Костерок)
[personal profile] eddy_em
Позор мне! Гугол не дал мне ответа на этот вопрос...
Суть проблемы: ни UNIX-time, ни юлианская дата не учитывают високосных секунд (юлианская дата еще и некоторых високосных дней не учитывает). Поэтому отняв время события А из времени события Б мы не получим реальной разницы во времени между ними.
Неужто нет такой сишной системной функции, которая это считает, используя tzdata и нужно парсить этот файл самому?

UPD. Решение было у меня под носом: это умеет libSOFA.

Date: 2016-12-30 07:01 am (UTC)
From: [identity profile] pewpewaction.livejournal.com
А тебе для чего? Разве еще не ввели чисто для науки, космоса и всяких межзвездных станций абсолютное время в наносекундах от какого-нибудь космического события, что бы уже не было никаких високосных секунд и еретических 30-31-28-29 дней в месяцах, а только метрическая абсолютноравномерная система? =)

Date: 2016-12-30 07:42 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Пока просто интереса ради. Вдруг понадобится точно интервалы измерять...
> Разве еще не ввели
Не встречал. У нас кривые блеска по юлианской дате строят — но на периодах в сутки потеря секунды-другой несущественна. А до 2100 года, когда в юлианских днях выплывет ошибка на 1 день, еще далеко.

Date: 2016-12-30 09:27 am (UTC)
From: [personal profile] ex0_planet
Трактат Нечаева читал?
http://segfault.kiev.ua/~netch/articles/time-counting.html
Я не знаю, решит ли он твою проблему (он большой и я не помню его целиком), просто это самая объемная и подробная работа по учету времени в юникс-системах, которую я знаю.

Еще гугол что-то вроде бы недавно изобретал для коррекции leap seconds.

Date: 2016-12-30 09:44 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Не нашел там о промежутке времени между двумя событиями.
А еще, кстати, в следующем веке приведенной там формулой связи UNIX time и юлианских дней пользоваться нельзя будет.
В астрономии для трансформации координат используется LibSOFA или устаревшая (и вообще неподдерживаемая) SLAlib. Я без понятия, как вычисляются координаты в стеллариуме, но, судя по сравнению, вычисляются они правильно (как и в LibSOFA) — т.е. leap seconds там тоже учитываются (как и всякие DUT'ы и т.п.). А вот SLAlib уже дает погрешность примерно в 3''.
Во внутренности не влезал: там очень страшно ☺

Кстати, полез сейчас в документацию к libSOFA и нашел ответ на свой вопрос: dT = TAI2 - TAI1. А вычислить TAI можно при помощи той же libSOFA:
double a1, a2;
j = iauDtf2d ( "TAI", 2009, 1, 1, 0, 0, 33.7, &a1, &a2 );

В переменных a1 и a2 будет находиться время TAI во "внутреннем формате". Думаю, исходники вполне помогут понять, как из этого "внутреннего формата" получить временнýю разницу.

Date: 2016-12-30 05:08 pm (UTC)
From: [identity profile] t-mike.livejournal.com
в таком случае используйте right tzdata и стандартные функции
/usr/share/zoneinfo/right/

Date: 2016-12-30 05:10 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Ну, проблема уже отпала, как я приписал.
> /usr/share/zoneinfo/right/
У меня такой директории нет.

Date: 2016-12-31 06:57 am (UTC)
From: [identity profile] t-mike.livejournal.com
хм... должна быть, может tzdata у вас где-то ещё, или пакет отдельный
и ещё, более правильно для имзмерения отрезков времени использовать монотонные шкалы, прада это не всегда удобно

Date: 2016-12-31 07:04 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Сама директория принадлежит пакету timezone-data:
equery b /usr/share/zoneinfo/      
 * Searching for /usr/share/zoneinfo/ ... 
sys-libs/timezone-data-2016h (/usr/share/zoneinfo)

Директория /usr/share/zoneinfo/right/ в состав пакета не входит.
Да и все равно: "СОФА" умеет вычислять атомное время, а по разнице двух атомных времен можно определить точный промежуток между событиями.

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 25th, 2025 07:53 pm
Powered by Dreamwidth Studios