雖然方法
public static double ToJulianDate(this DateTime date) { return date.ToOADate() + 2415018.5; }
作品爲現代的日期,它有顯著的缺點。
Julian日期定義爲負日期 - 即BCE(在共同時代之前)日期,並且在天文計算中很常見。您無法構造年份小於0的DateTime對象,因此無法使用上述方法爲BCE日期計算Julian日期。
1582年的公曆改革在10月4日至15日的日曆中出現了11天的漏洞。這些日期沒有在Julian日曆或格里曆日曆中定義,但DateTime接受它們作爲參數。此外,使用上述方法不會爲任何儒略日期返回正確的值。使用System.Globalization.JulianCalendar.ToDateTime()或將JulianCalendar時代傳遞給DateTime構造函數的實驗在1582年10月5日之前的所有日期仍然會產生不正確的結果。
以下例程改編自Jean Meeus的「天文算法」,從Julian日曆上的零時間-4月12日開始的所有日期返回正確的結果。如果傳遞了無效日期,他們還會拋出ArgumentOutOfRangeException。
public class JulianDate
{
public static bool isJulianDate(int year, int month, int day)
{
// All dates prior to 1582 are in the Julian calendar
if (year < 1582)
return true;
// All dates after 1582 are in the Gregorian calendar
else if (year > 1582)
return false;
else
{
// If 1582, check before October 4 (Julian) or after October 15 (Gregorian)
if (month < 10)
return true;
else if (month > 10)
return false;
else
{
if (day < 5)
return true;
else if (day > 14)
return false;
else
// Any date in the range 10/5/1582 to 10/14/1582 is invalid
throw new ArgumentOutOfRangeException(
"This date is not valid as it does not exist in either the Julian or the Gregorian calendars.");
}
}
}
static private double DateToJD(int year, int month, int day, int hour, int minute, int second, int millisecond)
{
// Determine correct calendar based on date
bool JulianCalendar = isJulianDate(year, month, day);
int M = month > 2 ? month : month + 12;
int Y = month > 2 ? year : year - 1;
double D = day + hour/24.0 + minute/1440.0 + (second + millisecond/1000.0)/86400.0;
int B = JulianCalendar ? 0 : 2 - Y/100 + Y/100/4;
return (int) (365.25*(Y + 4716)) + (int) (30.6001*(M + 1)) + D + B - 1524.5;
}
static public double JD(int year, int month, int day, int hour, int minute, int second, int millisecond)
{
return DateToJD(year, month, day, hour, minute, second, millisecond);
}
static public double JD(DateTime date)
{
return DateToJD(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Millisecond);
}
}
謝謝你這個詳細的解釋。 – cweston 2011-03-10 14:21:17
+1。真棒帖子。 – BSalita 2012-02-06 11:27:58
對不起,我不喜歡數學,但你做得很好。謝謝 – fiberOptics 2012-02-22 02:37:23