Pergunta

Como posso converter de um unix timestamp (dizer 1232559922) para uma data julian fracionária (2.454.853,03150).

Eu encontrei um site ( http://aa.usno.navy.mil /data/docs/JulianDate.php ), que realiza um cálculo semelhante, mas eu preciso fazer isso programaticamente.

As soluções podem ser em C / C ++, Python, Perl, bash, etc ...

Foi útil?

Solução

A época Unix (zero ponto) é 01 de janeiro de 1970 GMT. Que corresponde ao dia Julian de 2.440.587,5

Assim, em pseudo-código:

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

Outras dicas

Eu sei que este é um post antigo, mas eu só vou dizer ...

A resposta dada por Jason Cohen é uma boa aproximação da conversão.

Há um problema, porém que se relaciona com o número de segundos em um dia. Um dia é não -exactly- 86400 segundos de duração, e periodicamente segundos são adicionados ao dia a fim de manter o tempo sincronizado com os vários padrões observáveis. Estes são chamados segundo salto ( https://en.wikipedia.org/wiki/Leap_second ). segundos bissextos são adicionados ao UTC, a fim de mantê-lo dentro de 1 segundo de UT1.

É lógico que quanto mais e mais tempo decorrido desde 01 de janeiro de 1970, a conversão simples acima irá acumular mais e mais erro de "tempo real observável." Entre 1972 e 2013 não foram adicionados 25 segundos bissextos.

Parte da beleza ea simplicidade de números Dia Julian é que eles não representam cordas data em tudo. Eles são apenas uma contagem de tempo decorrido desde o início do Julian Epoch, bem como o tempo POSIX é uma contagem contínua de milissegundos desde o POSIX Epoch. O único problema que existe, então, é quando você tentar mapear um número Julian Day a uma cadeia de data localizada.

Se precisar de uma cadeia de data que é preciso para dentro de um minuto (em 2013), então você vai precisar de um algoritmo que pode explicar segundos bissextos.

Aqui está o meu código JavaScript para converter Unix timestamp Julian . Originalmente está mostrando a data e hora atual, mas com um pouco de modificação é a resposta à sua pergunta:

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

Trabalho jsFiddle exemplo aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top