Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何将官方日期时间转换为天文上精确的日期时间?_Date_Datetime - Fatal编程技术网

Date 如何将官方日期时间转换为天文上精确的日期时间?

Date 如何将官方日期时间转换为天文上精确的日期时间?,date,datetime,Date,Datetime,我一直在想如何将生日(DateTime)转换为天文上“精确”的DateTime值。时区:UTC+1 示例: public static DateTime OfficialDateTimeToExactDateTime(DateTime dtOfficial) { const double dExactDayLengthInHours = 24.0159254794; DateTime dtParse = new DateTime(1600, 3, 1, 0, 0, 0);

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

示例:

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);
}
我的朋友出生于1984年01月27日11:35

1984年是闰年。但1700年、1800年和1900年不是闰年。所以直到29号。2000年2月,我们在天文精确时间上落后了。1984年,我们“几乎”落后一天。所以天文上精确的时间应该在我朋友出生的官方日期之后,对吗

以下是我所知道的公历调整:

  • 每年有365天
  • 每四年是闰年(由365天改为366天)
  • 每一百年不是闰年
  • 每400年是闰年(与之前的规则不同)
  • 在2月底增加一天(闰年中2月有29天)

天文上一年有3652422天。 这意味着一天的时间是240159254794小时。 官方时间和天文时间“完全”相同的时间值应该是2000-03-01T00:00:00,对吗

因此,我们需要计算出在给定的官方时间内,官方时间和天文精确时间之间的差异有多大

我想了好几个小时,直到我的头开始痛。我想我会和你分担我的头痛。也许你们知道任何一个时间库可以计算出这个吗?

我想出了一个“解决方案”,看起来相当准确。它的作用如下:

  • 该方法从1600-03-01T00:00开始。教皇格雷戈十三世18年后。(我们的公历系统以其命名)确定了1582年的儒略历(以朱利叶斯·凯撒命名),宣布10月4日(星期四)之后的第二天是10月15日(星期五)-所以在历史书中实际上没有1582年10月5日至14日-并且在历法系统中增加了第100年和第400年的规则
  • 该方法总结了正式日期和确切日期之间的差异,直到达到给定日期为止
  • 在闰年,它应用教皇格雷戈十三世添加的修正。它在二月底这样做
代码:

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);
}
public static DateTime OfficialDateTimeToExactDateTime(DateTime dtOfficial)
{
常数双dExactDayLengthInHours=24.0159254794;
DateTime dtParse=新的日期时间(1600,3,1,0,0,0);
双德罗林豪斯=0.0;

while(dtParse)这不仅仅是恒星年的长度。你的问题似乎是将UTC转换为“平均太阳时”(UT1)甚至“视太阳时”。后者需要“时间方程”(谷歌会帮助你)。对于第一个(UTC=>UT1)你需要根据IERS发布的观测数据或近似公式(Jean Meeus et.al.)了解delta-T关系。因此,解决方案比你想象的要复杂得多。至少你还需要地理坐标,而不仅仅是对天文计算不精确的时区。“天文上一年有3652422天。这意味着一天有240159254794小时长”,这是不正确的。年和日是独立的概念一天注定是地球绕其自身轴线自转,而一年注定是地球绕太阳公转。两种不同的运动。但你当然可以用一天作为时间单位来测量一年的长度。谢谢你的评论。我在下面发布了一个简单的“解决方案”。你怎么看?”因为我们测量的天数实际上更短。”嗯,不。平均太阳日的长度与地球绕其自身轴线的旋转有关,并且与任何年份的长度无关。因此,这样的一天总是24小时长(UT1标度).你想描述的是天文年和公历年之间以天为单位的差异。没错。这就是我想说的。但是计算应该从他们确定日历的那一天开始?!好吧,我们有固定的天数(仅在分钟精度的情况下),但年的长度不同。这是比较持续时间。我们可以使用您的想法从1600-01-01开始作为参考点,然后将两个持续时间添加到此点以获得新的日期/时间戳。您可以使用类TimeSpan计算1600和方法参数之间的天数,然后转换天数,最后添加天文天数到1600来获得一个“天文”时间戳。这听起来对我来说仍然像一个黑客,但似乎比仅仅一个计数循环要好。记住,1600的选择仍然是任意的