gpt4 book ai didi

c# - 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?)

转载 作者:IT王子 更新时间:2023-10-29 04:15:08 24 4
gpt4 key购买 nike

我需要将标准的Gregorian 日期转换为Julian 日期。

我没有在 C# 中看到任何直接执行此操作的文档,但我发现很多帖子(在谷歌搜索时)建议使用 ToOADate .

关于 ToOADate 的文档不建议将此作为 Julian 日期的有效转换方法。

谁能说明这个函数是否会准确地执行转换,或者是否有更合适的方法将 DateTime 转换为 Julian 格式的字符串。


This当根据 Wikipedia's Julian Day page 验证时,为我提供了预期的数字

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;
}

但是,这是在不了解所使用的魔数(Magic Number)的情况下进行的。

谢谢


引用资料:

最佳答案

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 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 的模式。
    • 重写为 float ,为(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 天的相邻月份对齐。
    • 由于二月现在是一年的“年底”,我们不需要处理它的长度。它可能有 45 天(闰年为 46 天),唯一需要改变的是一年中天数的常量 365。
    • 请注意,这取决于 30 个月和 31 个月的天数模式。如果我们连续两个月都是 30 天,这是不可能的。
  • 365 * Year : 每年的天数
  • (Year / 4) - (Year / 100) + (Year / 400) : 每 4 年加一闰日,每 100 减一,每 400 加一。
  • + 1721119 :这是公元前 1 年 3 月 2 日的儒略日期。由于我们将日历的“开始”从 1 月移到了 3 月,因此我们将其用作偏移量,而不是 1 月 1 日。由于没有零年,1 BC 得到整数值 0。至于为什么 3 月 2 日而不是 3 月 1 日,我猜那是因为整个月的计算最后还是有点偏差。如果原作者使用了- 462而不是 - 457 (- 92.4 而不是 float 学中的 - 91.4),那么偏移量将是 3 月 1 日。

关于c# - 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com