2015-09-20 101 views
1

我想将包括小时分钟和秒钟的Julian日期转换为C#中的DateTime。Julian约会日期时间包括小时和分钟

这是数: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); 
} 
+0

既然你想要第二时间,请记住,闰秒可以使一天的时间为86,001秒而不是通常的86,000秒。普遍认为,JD的整数部分应该仅取决于UT日期(即,如果冬季保持全年的话,则为皇家格林威治时间的日期)。关于每天闰秒的分数不怎么被普遍认同。一种解决方法是将午夜以后的秒数除以86,001。你必须处理的最早和最晚的日期是什么? –

回答

1

这是你在找什么:Convert Julian Date with Time (H/m/s) to Date Time in C#
应用该答案,将您的值2457285.7795969结果于2015/9/19 11:42:37 PM中转换。

+1

也许值得从该链接复制一些代码,因为它可能会随着时间的推移而死去 –

+0

输入2457285.7795969进入美国海军天文台的多年计算机互动年鉴产量2015年9月20日06:42:37 UT1(它在UTC的0.9秒内) 。他们的网站(http://aa.usno.navy.mil/cgi-bin/aa_jdconv.pl?form=2&jd=2457285.779596)给出了几乎相同的结果,但秒数是37.1。如果兰迪实施了他/她正确链接的代码,那就错了。 –

+0

区别可能是由我当地时区引起的(太平洋时间:UTC - 7)。我粗心大意,并没有指定我在当地时间打印结果 – Ladi

0

之前拉迪回答什么我一直在寻找....

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

它应该是简单:

public static DateTime FromJulian(double julianDate) 
{ 
    return new DateTime(
    (long)((julianDate - 1721425.5) * TimeSpan.TicksPerDay), 
    DateTimeKind.Utc); 
} 

正如你所看到的,1721425.5是所谓的阳历epoch,即Julian日期在早期公历1月1日00: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 operator *(double, double)过载乘(内置在C#中)。这尽可能少地给出错误。如果double超出long的范围,则从doublelong的转换将抛出checked上下文。如果转换顺利进行,如果long的值超出了.NET DateTime的范围,则DateTime构造函数可能会抛出。


新的编辑:由另一个线程(Convert DateTime to Julian Date in C# (ToOADate Safe?))的启发,你也可以制定出使用DateTime.FromOADate一个非常简单的解决方案。但是,有关FromOADate方法的精密缺点,请参阅另一Stack Overflow post by myself

相关问题