我需要从标准转换公历约会到Julian天数。
我在 C# 中没有看到任何直接执行此操作的文档,但我发现许多帖子(在谷歌搜索时)建议使用ToOADate.
有关的文档ToOADate不建议将此作为儒略日期的有效转换方法。
任何人都可以澄清此函数是否能够准确地执行转换,或者可能是将 DateTime 转换为 Julian 格式字符串的更合适的方法。
This验证时为我提供了预期的数字维基百科的朱利安日页面
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;
}
然而,这是不了解所使用的幻数的。
Thanks
参考:
OADate 与儒略日期类似,但使用不同的起点(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) ...
:为了让神奇的数字发挥作用,他们将二月放在一年的“年底”。
-
(153 * Month - 457) / 5
: Wow, that's some serious magic numbers.
- 正常情况下每个月的天数为 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 的模式。
- 重写为浮点数,那就是
(int)(30.6 * Month - 91.4)
。 30.6 是每月的平均天数,不包括二月(准确地说是 30.63 重复)。 91.4 几乎是 3 个非 2 月份的平均天数。 (30.6 * 3 为 91.8)。
- So, let's remove the 30, and just focus on that 0.6 days. If we multiply it by the number of months, and then truncate to an integer, we'll get a pattern of 0s and 1s.
- 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 将补偿前三个月的天数,这些天数被移至一年的“年底”,并调整它将连续差值 1(上表中的 0.6 * 4 和 0.6 * 5)移动 0.4,以与 31 天的相邻月份对齐。
- 由于二月现在是一年的“年底”,我们不需要处理它的长度。它可能有 45 天(闰年为 46 天),唯一需要改变的是一年中的天数常数 365。
- 请注意,这依赖于 30 和 31 个月的天数模式。如果我们连续两个月都是 30 天,这是不可能的。
-
365 * Year
:每年的天数
-
(Year / 4) - (Year / 100) + (Year / 400)
:每 4 年加 1 个闰日,每 100 年减去 1 个闰日,每 400 年加 1 个闰日。
-
+ 1721119
:这是儒略历,即公元前 1 年 3 月 2 日。由于我们将日历的“开始”从 1 月移至 3 月,因此我们使用它作为偏移量,而不是 1 月 1 日。由于没有零年,所以 1 BC 得到的整数值为 0。至于为什么是 3 月 2 日而不是 3 月 1 日,我猜那是因为整个月份的计算在最后仍然有点偏差。如果原作者使用了- 462
代替- 457
(- 92.4
代替- 91.4
在浮点数学中),那么偏移量将是 3 月 1 日。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)