Converter unix timestamp para Julian
-
19-08-2019 - |
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 ...
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);