static double GetCumulativeLeapSeconds(double julianDate) { double leapSeconds = 0; const double daysOffset = 2400000.5; var leapSecondsArray = LeapSecondsArray.GetArray(); int length = leapSecondsArray.Length; if (julianDate >= leapSecondsArray[0].JulianDate) { //Find the index in the lookup table which contains the JulianDate value closest to the JulianDate input parameter bool isContinue = true; int index = 1; while (isContinue) { if (index >= length) { leapSeconds = leapSecondsArray[length - 1].Seconds + (julianDate - daysOffset - leapSecondsArray[length - 1].BaseModifiedJulian) * leapSecondsArray[length - 1].Coefficient; isContinue = false; } else if (julianDate < leapSecondsArray[index].JulianDate) { leapSeconds = leapSecondsArray[index - 1].Seconds + (julianDate - daysOffset - leapSecondsArray[index - 1].BaseModifiedJulian) * leapSecondsArray[index - 1].Coefficient; isContinue = false; } //Prepare for the next loop if (isContinue) { ++index; } } } return(leapSeconds); }
public static double ConvertCoordinatedTime(double julianDate) // Convert from universal coordinated time (UTC) given as a two-part pseudo-Julian date to terrestrial time(TT), represented as a two-part Julian date. { //Outside of the range 1 January 1961 to 500 days after the last leap second, // implement TT2UTC as TT2UT1 const int dayOffset = 500; var leapSecondsArray = LeapSecondsArray.GetArray(); int length = leapSecondsArray.Length; if ((julianDate < leapSecondsArray[0].JulianDate) || (julianDate > (leapSecondsArray[length - 1].JulianDate + dayOffset))) { return(ConvertUniversalTime(julianDate)); } double deltaOfTime = GetDeltaOfTime(julianDate); double leapSeconds = GetCumulativeLeapSeconds(julianDate); const int secondsInDay = 86400; const double secondsOffset = 32.184; return (julianDate - ((deltaOfTime - leapSeconds - secondsOffset) / secondsInDay) + (deltaOfTime / secondsInDay)); }