2009-01-21 200 views

回答

26

Unix紀元(零點)是1970年1月1日GMT。這相當於2440587.5

所以儒略日,在僞代碼:

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

你忘了在最後.5。 添加的常量應該是2440587.5 – 2009-10-03 08:09:13

+0

我不明白什麼是86400.0?結果與當前的時間表相差甚遠。 – eapo 2016-09-08 00:07:04

6

我知道這是一個古老的職位,但我只想說...

答案由傑森科恩給出的轉換是一個很好的近似值。

雖然這與一天中的秒數有關,但存在一個問題。一天的時間長度並不完全是86400秒,並且爲了保持與各種可觀察標準的時間同步,週期性地添加了週期性的秒數。這些被稱爲閏秒(https://en.wikipedia.org/wiki/Leap_second)。閏秒被添加到UTC以保持在UT1的1秒內。

由於自1970年1月1日以來越來越多的時間已經過去,上述簡單轉換將會產生越來越多的「實際可觀測時間」的錯誤。 1972年至2013年期間,又增加了25閏秒。

Julian Day數字的美和簡單性的部分原因是它們根本不代表日期字符串。它們只是自Julian Epoch開始以來的經過時間計數,非常類似於POSIX時間自POSIX Epoch以來的連續計數毫秒數。那麼存在的唯一問題就是當你試圖將朱利安天數映射到本地化的日期字符串時。

如果您需要一個精確到一分鐘內的日期字符串(2013年),那麼您需要一個算法來計算閏秒。

0

這是我的JavaScript代碼轉換Unix時間戳到朱利安。本來是顯示當前的日期和時間,但有一點是國防部回答你的問題:

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