Как я могу преобразовать временную метку unix (скажем, 1232559922) в дробную юлианскую дату (2454853.03150).
Я нашел веб-сайт (http://aa.usno.navy.mil/data/docs/JulianDate.php), который выполняет аналогичные вычисления, но мне нужно сделать это программно.
Решения могут быть на C / C++, python, perl, bash и т. д.





Эпоха Unix (нулевая точка) - 1 января 1970 г. по Гринвичу. Это соответствует 2440587,5 по юлианскому дню.
Итак, в псевдокоде:
function float getJulianFromUnix( int unixSecs )
{
return ( unixSecs / 86400.0 ) + 2440587.5;
}
я не могу понять, что такое 86400.0? и результат далек от текущего графика.
86400 - это множитель секунд в дни (1 день = 24 часа / день x 60 минут / час x 60 секунд / минуту)
Я знаю, что это старый пост, но скажу только ...
Ответ, данный Джейсоном Коэном, является хорошим приближением конверсии.
Однако есть проблема, связанная с количеством секунд в одном дне. День не имеет длины 86400 секунд, и время от времени к дням добавляются секунды, чтобы время синхронизировалось с различными наблюдаемыми стандартами. Они называются дополнительными секундами (https://en.wikipedia.org/wiki/Leap_second). Високосные секунды добавляются к всемирному координированному времени, чтобы не выходить за 1 секунду до UT1.
Само собой разумеется, что по мере того, как с 1 января 1970 года проходит все больше и больше времени, в приведенном выше простом преобразовании будет расти все больше и больше ошибок из «фактического наблюдаемого времени». С 1972 по 2013 год было добавлено 25 дополнительных секунд.
Отчасти красота и простота чисел Юлианского дня заключается в том, что они вообще не представляют собой строки даты. Это просто счетчик времени, прошедшего с начала юлианской эпохи, так же, как время POSIX - это непрерывный счетчик миллисекунд с начала эпохи POSIX. Таким образом, единственная проблема, которая существует, - это когда вы пытаетесь сопоставить число по юлианскому календарю с локализованной строкой даты.
Если вам нужна строка даты с точностью до минуты (в 2013 году), вам понадобится алгоритм, который может учитывать дополнительные секунды.
Я думаю, что время Unix / Posix игнорирует дополнительные секунды, поэтому алгоритм Джейсона Коэна не будет дрейфовать по мере накопления дополнительных секунд. См. en.wikipedia.org/wiki/Unix_time#Leap_seconds. Если я что-то не понимаю, пожалуйста, поправьте меня.
Вот мой код JavaScript для преобразования метки времени Unix в Юлиан. Первоначально показывает текущую дату и время, но с небольшой модификацией ответ на ваш вопрос:
function computeJulianDate(DD,MM,YY,HR,MN,SC) {
with (Math) {
HR = HR + (MN / 60) + (SC/3600);
GGG = 1;
if (YY <= 1585) GGG = 0;
JD = -1 * floor(7 * (floor((MM + 9) / 12) + YY) / 4);
S = 1;
if ((MM - 9)<0) S=-1;
A = abs(MM - 9);
J1 = floor(YY + S * floor(A / 7));
J1 = -1 * floor((floor(J1 / 100) + 1) * 3 / 4);
JD = JD + floor(275 * MM / 9) + DD + (GGG * J1);
JD = JD + 1721027 + 2 * GGG + 367 * YY - 0.5;
JD = JD + (HR / 24);
}
return JD;
}
function getUTCDateTimeOrJD(now,jd=0) {
var hours = now.getUTCHours();
var minutes = now.getUTCMinutes();
var seconds = now.getUTCSeconds()
var month = now.getUTCMonth() + 1;
var day = now.getUTCDate();
var year = now.getUTCFullYear();
if (jd==1)
return computeJulianDate(month, day, year, hours, minutes, seconds);
else
return day+". "+month+". "+year+". "+hours+":"+minutes+":"+seconds;
}
var unixTime = 1473294606;
getUTCDateTimeOrJD(new Date(unixTime*1000));
getUTCDateTimeOrJD(new Date(unixTime*1000),1);
Вы забыли .5 в конце. Добавляемая константа должна быть 2440587,5.