2009-01-21 220 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

相关问题