Pregunta

¿Cómo puedo convertir de una marca de tiempo Unix (digamos 1232559922) a una fecha juliana fraccional (2454853.03150)?

Encontré un sitio web ( http://aa.usno.navy.mil /data/docs/JulianDate.php ) que realiza un cálculo similar pero necesito hacerlo programáticamente.

Las soluciones pueden estar en C / C ++, python, perl, bash, etc ...

¿Fue útil?

Solución

La época de Unix (punto cero) es el 1 de enero de 1970 GMT. Eso corresponde al día juliano de 2440587.5

Entonces, en pseudocódigo:

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

Otros consejos

Sé que esta es una publicación antigua, pero solo diré ...

La respuesta dada por Jason Cohen es una buena aproximación de la conversión.

Sin embargo, hay un problema relacionado con la cantidad de segundos en un día. Un día no tiene exactamente 86400 segundos de duración, y periódicamente se agregan segundos a los días para mantener la hora sincronizada con los diversos estándares observables. Estos se llaman Leap Seconds ( https://en.wikipedia.org/wiki/Leap_second ). Los segundos de salto se agregan a UTC para mantenerlo dentro de 1 segundo de UT1.

Es lógico que a medida que haya transcurrido más y más tiempo desde el 1 de enero de 1970, la conversión simple anterior acumulará más y más errores a partir del "tiempo real observable". Entre 1972 y 2013 se agregaron 25 segundos bisiestos.

Parte de la belleza y la simplicidad de los números de Julian Day es que no representan cadenas de fecha en absoluto. Son solo un recuento del tiempo transcurrido desde el comienzo de la Época Juliana, al igual que el tiempo POSIX es un recuento continuo de milisegundos desde la Época POSIX. El único problema que existe, entonces, es cuando intenta asignar un número de Julian Day a una cadena de fecha localizada.

Si necesita una cadena de fecha con una precisión de un minuto (en 2013), necesitará un algoritmo que pueda dar cuenta de los segundos bisiestos.

Aquí está mi código JavaScript para convertir la marca de tiempo Unix en Julian . Originalmente muestra la fecha y hora actuales, pero con un pequeño mod es la respuesta a su pregunta:

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

Ejemplo de trabajo de JSFiddle aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top