Преобразовать метку времени Unix в юлианский - PullRequest
17 голосов
/ 21 января 2009

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

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

Решения могут быть на C / C ++, Python, Perl, Bash и т.д ...

Ответы [ 3 ]

31 голосов
/ 21 января 2009

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

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

function float getJulianFromUnix( int unixSecs )
{
   return ( unixSecs / 86400.0 ) + 2440587.5;
}
7 голосов
/ 08 июня 2013

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

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

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

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

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

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

0 голосов
/ 08 сентября 2016

Вот мой код 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);

Пример работы JSFiddle здесь

...