22

如何从 unix 时间戳(比如 1232559922)转换为小数儒略日期(2454853.03150)。

我找到了一个执行类似计算的网站(http://aa.usno.navy.mil/data/docs/JulianDate.php),但我需要以编程方式进行。

解决方案可以是 C/C++、python、perl、bash 等......

4

3 回答 3

35

Unix 纪元(零点)是 1970 年 1 月 1 日 GMT。这对应于儒略日 2440587.5

所以,在伪代码中:

function float getJulianFromUnix( int unixSecs )
{
   return ( unixSecs / 86400.0 ) + 2440587.5;
}
于 2009-01-21T18:00:47.860 回答
8

我知道这是一个旧帖子,但我只想说......

Jason Cohen 给出的答案是转换的一个很好的近似值。

虽然有一个问题与一天中的秒数有关。一天并不完全是 86400 秒长,并且会定期将秒数添加到天数中,以使时间与各种可观察标准保持同步。这些被称为闰秒(https://en.wikipedia.org/wiki/Leap_second)。将闰秒添加到 UTC 以使其保持在 UT1 的 1 秒内。

按理说,随着自 1970 年 1 月 1 日以来的时间越来越长,上述简单的换算会从“实际可观察​​时间”中产生越来越多的误差。从 1972 年到 2013 年,增加了 25 个闰秒。

Julian Day 数字的美丽和简单的部分原因在于它们根本不代表日期字符串。它们只是自儒略纪元开始以来经过的时间的计数,就像 POSIX 时间是自 POSIX 纪元以来的连续毫秒计数。那么,唯一存在的问题是当您尝试将儒略日数字映射到本地化日期字符串时。

如果您需要一个精确到一分钟内(2013 年)的日期字符串,那么您将需要一个可以解释闰秒的算法。

于 2013-06-08T19:13:51.357 回答
0

这是我将Unix时间戳转换为Julian的 JavaScript 代码。最初是显示当前的日期和时间,但有一点 mod 可以回答你的问题:

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

在这里工作的 JSFiddle 示例

于 2016-09-08T00:40:52.670 回答