2015-09-20 100 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

相關問題