2009-01-21 25 views

Odpowiedz

26

Unix epoka (zero-point) jest 1 stycznia 1970 GMT. Który odpowiada dnia Julian 2440587.5

tak, to w pseudo-kodzie:

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

zapomniałeś .5 na końcu. Dodatkowa stała powinna być 2440587.5 –

+0

Nie mogę zrozumieć, co to jest 86400.0? a wynik jest daleki od aktualnej osi czasu. – eapo

+0

86400 to współczynnik od sekund do dni (1 dzień = 24 godziny/dzień x 60 minut/godzinę x 60 sekund/minutę) – TNgo

6

wiem, że jest to stary post, ale ja po prostu powiedzieć ...

Odpowiedź dane przez Jasona Cohena są dobrym przybliżeniem nawrócenia.

Istnieje jednak pewien problem związany z liczbą sekund w ciągu jednego dnia. Dzień nie jest - dokładnie - 86400 sekund i okresowo są dodawane sekundy do dni, aby zachować synchronizację czasu z różnymi obserwowalnymi standardami. Nazywane są one "sekundami sekundowymi" (https://en.wikipedia.org/wiki/Leap_second). Sekundowe sekundy są dodawane do UTC, aby utrzymać je w ciągu 1 sekundy od UT1.

Jest oczywiste, że wraz z upływem czasu od 1 stycznia 1970, zwykła konwersja powyżej spowoduje wzrost liczby błędów z "faktycznego obserwowalnego czasu". W latach 1972-2013 dodano 25 sekund przestępnych.

Częścią piękna i prostoty liczb dnia juliańskiego jest to, że w ogóle nie reprezentują ciągów znaków daty. Są to tylko czas, jaki upłynął od początku epoki Juliańskiej, podobnie jak czas POSIX jest ciągłą liczbą milisekund od epoki POSIX. Jedynym problemem, który istnieje, jest próba zamapowania numeru juliańskiego na lokalny łańcuch daty.

Jeśli potrzebujesz ciągu dat z dokładnością do minuty (w 2013 r.), Będziesz potrzebować algorytmu, który będzie uwzględniał sekundy przestępne.

+8

Wydaje mi się, że czas Unix/Posix ignoruje sekundy przestępne, więc algorytm Jasona Cohena nie będzie dryfował w miarę wzrostu liczby sekund skoku . Zobacz http://en.wikipedia.org/wiki/Unix_time#Leap_seconds. Jeśli coś nie rozumiem, proszę mnie wyprostować. –

0

Oto mój kod JavaScript do konwersji Unix znacznik czasu do Julian. Pierwotnie pokazuje aktualną datę i czas, ale przy odrobinie mod jest odpowiedzieć na pytanie:

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

Powiązane problemy