【问题标题】:What are the default values taken (say 1721119) to calculate the Gregorian Year, Month, Day from Julian Day [closed]从儒略日计算公历年、月、日的默认值是什么(比如 1721119)[关闭]
【发布时间】:2013-06-03 12:04:28
【问题描述】:

提前非常感谢!

下面的代码 sn-p 是一个函数,它为我提供给定儒略日的年、月和日..

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

假设,我为 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;
}

【问题讨论】:

  • 看看This question on Julian dates in C# 的答案,1721119 是公元前 1 年 3 月 2 日的儒略日。
  • 值 1721119 的上述日期是如何计算的,所以其他值是什么..请帮助..
  • 你们关闭问题的人不好:(我喜欢这个问题!(我疯狂地在谷歌上搜索,试图弄清楚同样的事情,特别是因为我遇到的代码我不确定甚至与日期有关,它只是名为“v1,v2,v3”的常量和变量的随机混乱)

标签: c++ julian-date


【解决方案1】:

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

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

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

This paper(引用自Wikipedia)描述了逆计算(公历到儒略日)中的各种幻数是如何产生的;算法中的数字以类似的方式出现。

【讨论】:

  • 嗨,迈克,非常感谢。我为这个帮助付出了很多努力..干杯..请保持联系,我可能需要更多帮助...再次感谢
  • 嗨 Mike :) 我几乎理解了代码。请告诉我几件事:1)j = JD - 1721119; // ? => 这里 j 将是 735328 天.. 它实际上是什么。 2) y = (4 * j - 1) / 146097; // ? => 这里 y=20。我认为它是 20 世纪。具体来说什么是“(4 * j - 1)” 3) j = 4 * j - 1 - 146097 * y; //终于在这里开始了..我读了这篇文章..很大的帮助...再次感谢..热切地等待 4 你的回复..
  • @AjayVishwakarma_AV 你正在移动球门柱。你问了魔法数字,你得到了答案,你应该接受它。 SO 是一个 QA 站点,而不是一个您招募应该“保持联系”的助手的站点 - 请不要试图吸引您设法吸引的任何人的注意力来引导您完成其余的工作。如果您遇到其他问题,请自行研究,然后发布一个新的具体问题,而不是含糊不清的评论“这里发生了什么”。
  • @AjayVishwakarma_AV:正如我所说,j 最初是自公元前 1 年 3 月以来的天数。其余的有点繁琐,但在纸上很容易理解;正如你所说,y 最初是 20 20 个世纪;稍后,它乘以 100,并添加剩余年份(考虑闰日);和 md 是基于两个重复的 5 个月集合计算,然后是 1 月和 2 月,然后调整以使年份从 1 月开始。
猜你喜欢
  • 2014-06-20
  • 2013-07-30
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多