一尘不染

在C#中将DateTime转换为儒略日期(ToOADate安全吗?)

c#

我需要将标准的 公历 日期转换为 儒略 日数。

我没有看到任何用C#记录的文档可以直接执行此操作,但是我在Googling上发现了许多建议使用ToOADate的帖子

ToOADate上的文档没有建议将其作为儒略日期的有效转换方法。

任何人都可以澄清此函数是否将准确地执行转换,或者也许是将DateTime转换为儒略格式的字符串的更合适的方法。


通过Wikipedia的Julian
Day页面
验证后,为我提供了预期的数字

public static long ConvertToJulian(DateTime Date)
{
    int Month = Date.Month;
    int Day = Date.Day;
    int Year = Date.Year;

    if (Month < 3)
    {
        Month = Month + 12;
        Year = Year - 1;
    }
    long JulianDay = Day + (153 * Month - 457) / 5 + 365 * Year + (Year / 4) - (Year / 100) + (Year / 400) + 1721119;
    return JulianDay;
}

但是,这是不了解所使用的幻数的。

谢谢


参考文献:


阅读 923

收藏
2020-05-19

共1个答案

一尘不染

OADate与朱利安日期(Julian
Dates)类似,但使用不同的起点(1899年12月30日与主前4713年1月1日)和一个不同的“新日期”点。朱利安日期(Julian
Dates)认为中午是新的一天的开始,OADates使用现代定义午夜。

1899年12月30日午夜的儒略日期为2415018.5。此方法应为您提供适当的值:

public static double ToJulianDate(this DateTime date)
{
    return date.ToOADate() + 2415018.5;
}

至于算法:

  • if (Month < 3) ...:为了使魔术数字正确运行,他们将2月定为今年的“年底”。
  • (153 * Month - 457) / 5:哇,那是一些严肃的魔术数字。
    • 通常,每个月的天数为31 28 31 30 31 30 31 31 31 30 31 30 31,但是在if语句中进行调整后,该天数变为31 30 31 30 31 31 30 31 30 31 31 28。 30,最后得到1 0 1 0 1 1 0 1 0 1 1 -2。他们通过在整数空间中进行除法来创建1和0的模式。
    • 将其重写为浮点数(int)(30.6 * Month - 91.4)。30.6是每月的平均天数,不包括2月(准确地说是30.63重复)。91.4几乎是3月平均非2月份的天数。(30.6 * 3是91.8)。
    • 因此,让我们删除30天,仅关注0.6天。如果将其乘以月份数,然后截断为整数,我们将得到0和1的模式。
    • 0.6 * 0 = 0.0-> 0
    • 0.6 * 1 = 0.6-> 0(0的差)
    • 0.6 * 2 = 1.2-> 1(相差1)
    • 0.6 * 3 = 1.8-> 1(差异为0)
    • 0.6 * 4 = 2.4-> 2(相差1)
    • 0.6 * 5 = 3.0-> 3(相差1)
    • 0.6 * 6 = 3.6-> 3(差值为0)
    • 0.6 * 7 = 4.2-> 4(相差1)
    • 0.6 * 8 = 4.8-> 4(差异为0)
    • 看到正确的差异模式了吗?这与上面列表中的模式相同,即每月的天数减去30。减去91.8将补偿前三个月的天数,这些天数已移至该年的“年底”,并进行了调整它以0.4的方式移动连续的差异1(上表中的0.6 * 4和0.6 * 5)以与相邻的31天一致。
    • 由于2月已到了今年的“末尾”,因此我们不需要处理它的长度。它可能长达45天(a年为46天),唯一需要更改的是一年中的天数常数365。
    • 请注意,这取决于30和31个月工作日的模式。如果我们连续两个月(也就是30天),那么这将是不可能的。
  • 365 * Year:每年的天数
  • (Year / 4) - (Year / 100) + (Year / 400):每4年增加一次leap日,每100年减一,再每400年减一。
  • + 1721119:这是公元前3月2日的儒略日。由于我们将日历的“开始”从1月移至3月,因此我们将其用作偏移量,而不是1月1日。由于没有零年,所以1 BC获得的整数值为0。至于为什么3月2日而不是3月1日,我猜这是因为整个月末的计算仍然有些偏差。如果原始作者使用- 462而不是- 457- 92.4而不是- 91.4浮点数学),则偏移量应为3月1日。
2020-05-19