2014-10-31 51 views
3

我一直想弄清楚如何将生日(DateTime)转换为天文“精确”的DateTime值。时区:UTC + 1。如何将官方DateTime转换为天文精确的DateTime?

例子:

我的朋友生于1984年1月27日11:35

1984年是闰年。但1700年,1800年和1900年不是闰年。因此,直到2000年的二月二十九日,我们都在精确的天文学时间之后。 1984年,我们“落后”了一天。因此,天文学确切的时间将在我朋友出生的正式日期时间之后,对吗?

这是公历的调整,我知道的:

  • 每年有365天
  • 每4年是闰年(=有366天而不是365)
  • 每100年是不是闰年
  • 每第400年是闰年(dispite以前的规则)
  • 额外的一天在二月(二月有29天,闰年)
  • 的末尾添加

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

所以人们需要弄清官方时间与天文学精确时间之间的差异在特定的官方时间有多大。

我一直在想它几个小时,直到我的头开始伤害。我想我会和你分享我的头痛。也许你们知道任何时间都可以计算出这个数据库吗?

+1

这不仅是关于恒星年的长度。你的问题似乎是将UTC转换为“平均太阳时间”(UT1)甚至“明显的太阳时间”。后者需要“时间等式”(谷歌会帮你)。对于第一个(UTC => UT1),您需要根据IERS公布的观测数据或基于近似公式(Jean Meeus et.al.)来了解Δ-T关系。所以解决方案比你想象的要复杂得多。至少你还需要地理坐标,而不仅仅是对天文计算不准确的时区。 – 2014-10-31 11:39:00

+0

“天文学上每年有365,2422天,这意味着每天24,015,9254794小时”,这是不正确的。年和日是独立的概念。 (朔式)日与地球围绕自身轴线的旋转有关,而年则与太阳周围的地球革命有关。两种不同的动作。但你当然可以用一天的时间单位来衡量一年的时间长短。 – 2014-10-31 12:16:21

+0

感谢您的意见。我发布了一个简单的“解决方案”。你怎么看? – 2014-11-01 11:10:34

回答

1

我想出了一个似乎相当准确的“解决方案”。以下是它的作用:

  • 该方法始于1600-03-01T00:00。教皇格雷戈尔十三世18年后。 (我们的格里历日历系统被命名后)于1582年修正了朱利安日历(以Julius Caesar命名),宣布10月4日(星期四)之后第二天将是10月15日(星期五) - 所以实际上没有第5日到1582年10月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); 
} 

我做了一些冒烟测试:

  • 如果传递2000-03-01T00之前的日期:你得到一个负的校00。因为我们实际上测量的日期较短。
  • 如果你在2000-03-01T00:00之后通过一个日期,你会得到一个积极的更正。这是因为2000年是一个闰年(而1700年,1800年和1900年不是),但是所采用的修正过大。在24×400 = 4800年的时间里,修正大概是一天。所以在1600 + 4800 = 6400年(如果人还活着的话),尽管有公历的规则,你仍然需要6400年非闰年。
+0

“因为我们实际上测量的日期更短。”嗯,不。平均太阳日的长度与地球绕其自身轴线的旋转相关,并且与任何年份的长度无关。所以这样的一天总是24小时(以UT1规模)。你想要描述的是以天为单位表示的天文年和公历年之间的差异。确切地说,是 – 2014-11-03 16:00:36

+0

。这就是我想说的。但是计算应该从他们修好日历的那一天开始?! – 2014-11-04 07:04:22

+1

好的,所以我们有固定的天数(仅在精确的情况下),但是不同的年限。这是比较**持续时间**。我们可以将您的想法作为参考点在1600-01-01开始,然后将两个持续时间添加到此点以获取新的日期/时间戳。您可以使用TimeSpan类来评估1600和方法参数之间的天数,然后转换天数,最后将天文天数添加到1600以获得“天文”时间戳。这听起来对我来说仍然像一个黑客,但似乎不仅仅是一个计数循环。请记住,1600的选择仍然是任意的 – 2014-11-04 12:31:28