代码之家  ›  专栏  ›  技术社区  ›  bgoncalves

将unix时间戳转换为julian

  •  23
  • bgoncalves  · 技术社区  · 17 年前

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

    我找到了一个网站( http://aa.usno.navy.mil/data/docs/JulianDate.php )它执行类似的计算,但我需要用程序来完成。

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

    4 回复  |  直到 17 年前
        1
  •  34
  •   xyzzycoder    13 年前

    Unix纪元(零点)是格林尼治标准时间1970年1月1日。这对应于2440587.5的儒略历日

    因此,在伪代码中:

    function float getJulianFromUnix( int unixSecs )
    {
       return ( unixSecs / 86400.0 ) + 2440587.5;
    }
    
        2
  •  8
  •   scottb    13 年前

    我知道这是一篇旧文章,但我只能说。..

    Jason Cohen给出的答案很好地近似了这种转换。

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

    理所当然的是,自1970年1月1日以来,随着时间的推移,上述简单的转换将与“实际可观测时间”产生越来越多的误差。1972年至2013年间,增加了25闰秒。

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

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

        3
  •  0
  •   eapo    10 年前

    这是我要转换的JavaScript代码 Unix操作系统 时间戳到 朱利安 。最初显示的是当前日期和时间,但用一点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);
    

    Working JSFiddle example here