在C#中将DateTime转换为儒略日期(ToOADate安全吗?)
我需要将标准的 日期转换为 日数。
我没有看到任何用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;
}
但是,这是不了解所使用的幻数的。
谢谢
- DateTime.ToOADate方法
回答:
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日。
以上是 在C#中将DateTime转换为儒略日期(ToOADate安全吗?) 的全部内容, 来源链接: utcz.com/qa/429504.html