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

C# 朱利安日期到日期时间,包括小时和分钟,c#,datetime,julian-date,C#,Datetime,Julian Date,我正在尝试将包含小时分钟和秒的朱利安日期转换为C#中的日期时间 这是号码:2457285.7795969 我可以使用此功能计算日期时间,不包括小时和分钟 public static DateTime FromJulian(long julianDate) { long L = julianDate + 68569; long N = (long)((4 * L) / 146097); L = L - ((long)((146097 * N + 3) / 4));

我正在尝试将包含小时分钟和秒的朱利安日期转换为C#中的日期时间

这是号码:
2457285.7795969

我可以使用此功能计算
日期时间
,不包括小时和分钟

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

这就是你想要的吗:?

应用该答案,将2457285.7795969的值转换为2015年9月19日晚上11:42:37。

在Ladi回答我的问题之前

double L = DateTime.Now.ToOADate() + 2415018.5 + 68569;

double HMS = L-(int)L-0.5;  

int Hours = (int)(24*HMS);
HMS=HMS - (double)(Hours/24.0);
int Mins = (int)(24*60*HMS);
HMS=HMS - (double)(Mins/(24.0*60));

int Secs = (int)(24*60*60*HMS);

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

DateTime test = new DateTime(Year, Month, Day);
Console.WriteLine("Hours-"+Hours);
Console.WriteLine("Mins-" + Mins);
Console.WriteLine("Secs-"+ Secs);

Console.WriteLine(test);
Console.WriteLine(DateTime.Now.ToString());

它应该简单到:

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
超出了
long
的范围,则从
double
long
的转换将进入
checked
上下文。如果转换顺利,
DateTime
构造函数可能会在
long
的值超出.NET
DateTime
的范围时抛出



新编辑:受另一个线程()的启发,您还可以使用
DateTime.FromOADate
制定一个非常简单的解决方案。然而,请参阅另一个关于FromOADate方法的
的精度缺陷。

可能值得从该链接复制一些代码,因为它可能会随着时间的推移而消失,将2457285.7795969输入美国海军天文台的多年计算机交互年历中会产生2015年9月20日06:42:37.2 UT1(在UTC的0.9秒内)。他们的网站()给出了几乎相同的结果,但秒数为37.1。如果Landi正确地实现了他/她链接到的代码,那就是错误的。这种差异可能是由我所在的本地时区(太平洋时间:UTC-7)造成的。我很粗心,没有说明我是在本地时间打印结果的。链接的答案(你应该复制到这里,使你的文章更加完整)通过Unix时间(起源于1970年1月1日)传递,没有什么好的理由。NET中的时间起源于公历1月1日。请参阅我的答案。堆栈溢出使用与您相同的外部源。由于您希望时间精确到秒,请记住,闰秒可以使一天延长86001秒,而不是通常的86000秒。普遍认为,JD的整数部分应仅取决于UT日期(即,如果冬季时间全年保持不变,则为皇家格林威治时间的日期)。对于一天中闰秒的分数该怎么办还没有得到普遍的认同。一种解决方案是将午夜后的秒数除以86001。你必须处理的最早和最晚日期是什么?