Преобразование unix timestamp в julian

Как я могу конвертировать из временной метки unix (например, 1232559922) в дробную дату юлианства (2454853.03150).

Я нашел веб-сайт (http://aa.usno.navy.mil/data/docs/JulianDate.php), который выполняет аналогичный расчет, но мне нужно сделать это программно.

Решения могут быть в C/С++, python, perl, bash и т.д.

Ответы

Ответ 1

Эпоха Unix (нулевая точка) - 1 января 1970 года. Это соответствует юлианскому дню 2440587.5

Итак, в псевдокоде:

function float getJulianFromUnix( int unixSecs )
{
   return ( unixSecs / 86400.0 ) + 2440587.5;
}

Ответ 2

Я знаю, что это старый пост, но я просто скажу...

Ответ, данный Джейсоном Коэном, является хорошим приближением преобразования.

Существует проблема, хотя это связано с количеством секунд за один день. День - неточно - 86400 секунд, и периодически добавляются секунды в дни, чтобы синхронизировать время с различными наблюдаемыми стандартами. Они называются секундомерами (https://en.wikipedia.org/wiki/Leap_second). В UTC добавляются секунды прыжка, чтобы сохранить его в течение 1 секунды от UT1.

Понятно, что с 1 января 1970 года с тех пор, как все больше и больше времени истекает, простое преобразование выше будет набирать все больше и больше ошибок с "фактического наблюдаемого времени". Между 1972 и 2013 годами было добавлено 25 секундных прыжков.

Частью красоты и простоты номеров Julian Day является то, что они вообще не представляют строки даты. Это всего лишь счет истекшего времени с начала Юлийской эпохи, так же как время POSIX - это непрерывное количество миллисекунд с эпохи POSIX. Единственная проблема, которая существует, - это когда вы пытаетесь сопоставить номер юлианского дня с локализованной строкой даты.

Если вам нужна строка даты, которая точна с точностью до минуты (в 2013 году), вам понадобится алгоритм, который может учитывать секунды прыжка.

Ответ 3

Вот мой код JavaScript для преобразования Unix timestamp в Julian. Первоначально отображается текущая дата и время, но с небольшим модом ответ на ваш вопрос:

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);

Рабочий пример JSFiddle здесь