【问题标题】:Convert unix timestamp to julian将unix时间戳转换为朱利安
【发布时间】:2010-10-02 18:04:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: datetime timestamp date julian-date


    【解决方案1】:

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

    所以,在伪代码中:

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

    【讨论】:

    • 你忘记了最后的 .5。添加的常量应该是 2440587.5
    • 我无法理解 86400.0 是什么?结果与当前的时间线相差甚远。
    • 86400 是秒到天的因子(1 天 = 24 小时/天 x 60 分钟/小时 x 60 秒/分钟)
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    【解决方案3】:

    这是我将 Unix 时间戳转换为 Julian 的 JavaScript 代码。最初是显示当前的日期和时间,但是用一个小模组来回答你的问题:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2023-03-18
      • 2020-10-19
      • 2013-07-02
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多