我一直在尝试找出如何将生日(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进行更改。