我正在尝试将包含小时、分钟和秒的儒略日期转换为 C# 中的日期时间。
这是号码:2457285.7795969
我可以使用此函数计算DateTime
排除小时和分钟。
public static DateTime FromJulian(long julianDate)
{
long L = julianDate + 68569;
long N = (long)((4 * L) / 146097);
L = L - ((long)((146097 * N + 3) / 4));
long I = (long)((4000 * (L + 1) / 1461001));
L = L - (long)((1461 * I) / 4) + 31;
long J = (long)((80 * L) / 2447);
int Day = (int)(L - (long)((2447 * J) / 80));
L = (long)(J / 11);
int Month = (int)(J + 2 - 12 * L);
int Year = (int)(100 * (N - 49) + I + L);
return new DateTime(Year, Month, Day);
}
最佳答案
它应该像这样简单:
public static DateTime FromJulian(double julianDate)
{
return new DateTime(
(long)((julianDate - 1721425.5) * TimeSpan.TicksPerDay),
DateTimeKind.Utc);
}
如您所见,1721425.5
是所谓的公历纪元,即儒略日期在公历开始时的值,即 0001 1 月 1 日 00:00:00.0000000 ,其中 .NET DateTime
有其起源。
编辑:如果您想确保您的方法在“极端”输入上引发异常而不是返回无效值,请执行以下操作:
public static DateTime FromJulian(double julianDate)
{
return new DateTime(
checked((long)((julianDate - 1721425.5) * TimeSpan.TicksPerDay)),
DateTimeKind.Utc);
}
请注意,我们使用 double 运算符 *(double, double)
重载(C# 中内置)执行乘法。这会尽可能减少错误。如果 double
超出 的范围,从
。如果转换顺利,如果 double
到 long
的转换将抛出 checked
上下文。长long
的值超出 .NET DateTime
的范围,则 DateTime
构造函数可能会抛出异常。
新编辑:受另一个线程 ( Convert DateTime to Julian Date in C# (ToOADate Safe?) ) 的启发,您还可以使用 DateTime.FromOADate
制定一个非常简单的解决方案。不过,请参阅另一个Stack Overflow post by myself关于 FromOADate
方法的精度缺陷。
关于c# - 朱利安日期到日期时间,包括小时和分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676664/