Domanda

Come posso convertire da un timestamp unix (diciamo 1232559922) a una data juliana frazionaria (2454853.03150).

Ho trovato un sito Web ( http://aa.usno.navy.mil /data/docs/JulianDate.php ) che esegue un calcolo simile ma devo farlo programmaticamente.

Le soluzioni possono essere in C / C ++, python, perl, bash, ecc ...

È stato utile?

Soluzione

L'epoca di Unix (punto zero) è il 1 gennaio 1970 GMT. Ciò corrisponde al giorno giuliano di 2440587,5

Quindi, in pseudo-codice:

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

Altri suggerimenti

So che questo è un vecchio post, ma dirò solo ...

La risposta data da Jason Cohen è una buona approssimazione della conversione.

Esiste tuttavia un problema relativo al numero di secondi in un giorno. Un giorno non è lungo esattamente 86400 secondi e periodicamente vengono aggiunti secondi ai giorni per mantenere il tempo sincronizzato con i vari standard osservabili. Questi sono chiamati Leap Seconds ( https://en.wikipedia.org/wiki/Leap_second ). I secondi saltati vengono aggiunti a UTC per mantenerlo entro 1 secondo da UT1.

È ovvio che, poiché sempre più tempo è trascorso dal 1 ° gennaio 1970, la semplice conversione sopra accumulerà sempre più errori dal "tempo osservabile effettivo". Tra il 1972 e il 2013 sono stati aggiunti 25 secondi bisestili.

Parte della bellezza e della semplicità dei numeri del giorno giuliano è che non rappresentano affatto stringhe di date. Sono solo un conteggio del tempo trascorso dall'inizio dell'epoca giuliana, proprio come il tempo POSIX è un conteggio continuo di millisecondi dall'epoca POSIX. L'unico problema che esiste, quindi, è quando si tenta di mappare un numero del giorno giuliano su una stringa di data localizzata.

Se hai bisogno di una stringa di date che sia accurata entro un minuto (nel 2013), allora avrai bisogno di un algoritmo in grado di tenere conto dei secondi bisestili.

Ecco il mio codice JavaScript per convertire Unix timestamp in Julian . Inizialmente mostra la data e l'ora correnti, ma con un po 'di mod è la risposta alla tua domanda:

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

Esempio di JSFiddle funzionante qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top