我一直在尝试找出如何将生日(DateTime)转换为天文“精确”的DateTime值。时区:UTC + 1。

例:

我的朋友出生于1984-01-27 11:35

1984年是a年。但是1700、1800和1900年不是leap年。因此,直到2000年2月29日,我们在天文准确时间上都落后了。在1984年,我们“几乎”落后了一天。因此,从天文角度来看,确切的时间应该是在我朋友出生的官方DateTime之后,对吗?

这些是我知道的公历日历调整:


每年有365天
每四年是is年(=有366天而不是365天)
每100年不是is年
每第400年是a年(尽管有以前的规定)
在2月底添加了另一天(2月在Fe年中有29天)


从天文学角度来说,一年有365,2422天。
这意味着一天的时间为24,0159254794小时。
官方时间与天文时间“完全”相同的时间值应该是2000-03-01T00:00:00,对吧?

因此,需要弄清楚在给定的官方时间,官方时间与天文精确时间之间的差异有多大。

我已经考虑了好几个小时,直到我的头开始疼。我想我会和你一样头痛。也许你们知道任何时间库都可以计算出来?

最佳答案

我想出了一个“解决方案”,似乎足够准确。这是它的作用:


该方法始于1600-03-01T00:00。在教皇格里格十三世之后的18年。 (以我们的格里高利历系统命名)在1582年通过声明10月4日(星期四)之后的第二天是10月15日(星期五),修复了儒略历(以朱利叶斯·凯撒命名)。到1582年10月14日的历史记录中-并且还将100年和400年规则添加到日历系统中。
该方法汇总了官方日期与确切日期之间的差异,直到达到给定日期为止。
在leap年,它将应用教皇格里高十三世增加的修正。它在二月底这样做。


码:

public static DateTime OfficialDateTimeToExactDateTime(DateTime dtOfficial)
{
    const double dExactDayLengthInHours = 24.0159254794;
    DateTime dtParse = new DateTime(1600, 3, 1, 0, 0, 0);
    double dErrorInHours = 0.0;

    while (dtParse <= dtOfficial)
    {
        dErrorInHours += dExactDayLengthInHours - 24;
        dtParse = dtParse.AddDays(1);
        if (dtParse.Month == 3 && dtParse.Day == 1 &&
            ((dtParse.Year % 4 == 0 && dtParse.Year % 100 != 0) ||
             (dtParse.Year % 400 == 0)) )
        {
            dErrorInHours -= 24;
        }
    }

    dErrorInHours += ((double)dtOfficial.Hour + (double)dtOfficial.Minute / 60 + (double)dtOfficial.Second / 3600) *  (dExactDayLengthInHours - 24);

    return dtOfficial.AddHours(dErrorInHours * -1);
}


我做了一些健全性测试:


如果您传递的日期在2000-03-01T00:00之前,您将得到否定的更正。因为我们测量的天数实际上要短一些。
如果您传递的日期在2000-03-01T00:00之后,则会得到一个正校正。这是因为2000年是a年(而1700、1800和1900不是),但是所应用的校正太大。在24 x 400 = 4800年中,校正可能会过一天。因此,在公元1600 + 4800 = 6400的情况下(如果人还活着),尽管有公历的规定,您仍需要在非del年对delcare 6400进行更改。

07-26 06:49