c# - 朱利安日期到日期时间,包括小时和分钟

标签 c# datetime julian-date

我正在尝试将包含小时、分钟和秒的儒略日期转换为 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 超出 的范围,从 doublelong 的转换将抛出 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/

相关文章:

javascript - moment.js 第二个参数不起作用

python - 从字符串日期中提取一年中的某一天和儒略日

javascript - 使用 javascript 将 iso8601 日期时间字符串映射到儒略日

perl - 在 Perl 中将日期 DD/MM/YYYY 转换为 7 位儒略日期

Python Pandas 数据帧 : convert local UTM time to GMT using longitude

c# - IEnumerable<IEnumerable<int>> - 没有重复的 IEnumerable<int>

c# - 如何在unity3d中制作测距仪

c# - 在内存中创建文件夹?

c# - WPF 列表框通过单击空白区域删除选择

python - Pandas 数据帧,ValueError : shape mismatch: objects cannot be broadcast to a single shape