-1

提前非常感谢!

下面的代码片段是一个函数,它为我提供给定儒略日的年、月和日。

你能告诉我这里的常数是什么意思吗?我可以在网上找到这段代码,但没有人解释这里采用的默认值。另外,如果有人可以解释该功能将做什么。

假设,我为 JD 传递的值是 2456447..

VOID GetGregorianDate(LONG JD, PWORD Year, PWORD Month, PWORD Day)
{
    LONG j, y, d, m;
    j = JD - 1721119;            //what is this value - 1721119 (may be related to day.. but how ?)
    y = (4 * j - 1) / 146097;    //what is this value - 146097 (may be related to year.. but how ?)
    j = 4 * j - 1 - 146097 * y;
    d = j / 4;
    j = (4 * d + 3) / 1461;        // ?
    d = 4 * d + 3 - 1461 * j;
    d = (d + 4) / 4;
    m = (5 * d - 3) / 153;        // ?
    d = 5 * d - 3 - 153 * m;
    d = (d + 5) / 5;
    y = 100 * y + j;
    if (m < 10)
    {
        m = m + 3;
    }
    else 
    {
        m = m - 9;
        y = y + 1;
    }

    *Year   = (WORD) y;
    *Month  = (WORD) m;
    *Day    = (WORD) d;
}
4

1 回答 1

3

它们只是公历和被选为儒略纪元开始的任意日期的产物。

  • 1721119 是从 JD 0 到 3 月 1BC 开始的偏移量(因为没有 0AD);减去它给出了从那时起的天数。选择 3 月作为一年的“开始”,以便闰日在“结束”出现,这使得算术更简单。
  • 146097 是四个世纪中的天数,也就是闰年循环重复所需的时间。
  • 1461 是四年中的天数(短闰年周期)。
  • 153 是连续 5 个月中的天数,在 31 天和 30 天之间交替(3 月至 7 月或 8 月至 12 月)。
  • 3、9的各种加减法,是为了还原一年的“开始”到一月。

考虑到闰年和不同的月份长度,巧妙的算术将它们放在一起给出正确的天数。

这篇论文(引用自维基百科)描述了逆计算(公历日期到儒略日)中的各种幻数是如何产生的;算法中的数字以类似的方式出现。

于 2013-06-03T12:25:33.730 回答