2009-01-21 40 views

Respuesta

26

El Unix época (punto cero) es 1 de enero, 1970, hora GMT. Que se corresponde con el día Juliano de 2.440.587,5

Así, en pseudo-código:

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

se le olvidó el 0,5 al final. La constante añadida debe ser 2440587.5 –

+0

no puedo entender lo que es el 86400.0? y el resultado está lejos de la línea de tiempo actual. – eapo

+0

86400 es el factor de segundos a días (1 día = 24 horas/día x 60 minutos/hora x 60 segundos/minuto) – TNgo

6

Sé que esta es una entrada antigua, pero sólo voy a decir ...

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

Aunque hay un problema relacionado con la cantidad de segundos en un día. Un día no es -exactamente- de 86400 segundos de duración, y periódicamente se agregan segundos a los días para mantener el tiempo sincronizado con los diversos estándares observables. Estos se denominan Leap Seconds (https://en.wikipedia.org/wiki/Leap_second). Los segundos intercalares se agregan a UTC para mantenerlo dentro de 1 segundo de UT1.

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

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

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

+8

Creo que el tiempo Unix/Posix ignora los segundos intercalares, por lo que el algoritmo de Jason Cohen no se desplazará a medida que se acumulen los segundos . Ver http://en.wikipedia.org/wiki/Unix_time#Leap_seconds. Si estoy malinterpretando las cosas, por favor, aclárame. –

0

Aquí está mi código JavaScript para convertir Unix marca de tiempo a Julian. Originalmente se muestra la fecha y hora actuales, pero con un poco 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); 

Working JSFiddle example here

Cuestiones relacionadas