宝藏就在这里,就看还在上这门课的学弟学妹能不能发现了
时间系统模块
1.1儒略日
时间定义与表示
儒略日(Julian day,JD)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。如果计算相隔若干年的两个日期之间间隔的天数,利用儒略日就比较方便。
在程序中,用结构体JDTIME表示儒略日时间,结构体定义如下
1 2 3 4 5 6 7 8 9 10 11 12 | /* 儒略日; */ struct JDTIME { int Days; double FracDay;
JDTIME() { Days = 0; FracDay = 0.0; } }; |
1.2简化儒略日
1 2 3 4 5 6 7 8 9 10 11 12 | /* 简化儒略日; */ struct MJDTIME { int Days; double FracDay;
MJDTIME() { Days = 0; FracDay = 0.0; } }; |
时间定义与表示
1.3通用时
时间定义与表示
1 2 3 4 5 6 7 8 9 10 | /* 通用时间定义; */ struct COMMONTIME { unsigned short Year; unsigned short Month; unsigned short Day; unsigned short Hour; unsigned short Minute; double Second; }; |
1.4GPST
时间定义与表示
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* GPS时间定义 */ struct GPSTIME { unsigned short Week; double SecOfWeek;
GPSTIME() { Week = 0; SecOfWeek = 0.0; } }; |
1.5年积日
无
时间定义与表示
1.3时间系统相互转换公式与代码
1.3.1儒略日与简化儒略日
1.儒略日到简化儒略日转换公式
假设简化儒略日表示为MJD ,儒略日表示为JD 。我们可以得到JD=MJD-2400000.5
3.转换程序代码
儒略日到简化儒略日
1 2 3 4 5 6 7 | bool JDTime2MJDTime(const JDTIME JD, MJDTIME*MJD) {
MJD->Days = JD.Days - 2400000 - (int)(JD.FracDay - 0.5-1); MJD->FracDay = FRAC(JD.FracDay + 1 - 0.5); return true; } |
简化儒略日到儒略日
1 2 3 4 5 6 7 | bool MJDTime2JDTime(const MJDTIME MJD, JDTIME*JD) {
JD->Days = MJD.Days + 2400000 + (int)(MJD.FracDay + 0.5); JD->FracDay = FRAC(MJD.FracDay+0.5); return true; } |
1.3.2儒略日与通用时
1.儒略日到通用时转换公式
2.通用时到儒略日转换公式
JD=INT[365.25y]+INT[30.6001(m+1)]+D+UT/24+1720981.5
MJD=JD-2400000.5
其中:
如果M≤2 ,则y=Y-1,m=M+12
如果M>2 ,则y=Y,m=M
JD 为儒略日
Y 为年,M 为月, D为日,UT 为世界时
INT[] 表示取实数的整数部分
3.转换程序代码
儒略日到通用时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | bool JDTime2CommonTime(const JDTIME JD, COMMONTIME*Common) { MJDTIME MJD; MJD.Days = JD.Days - 2400000 - (int)(JD.FracDay - 0.5 - 1); MJD.FracDay = FRAC(JD.FracDay + 1 - 0.5); int a, b, c, d, e = 0; double UTDay = 0; double UT = 0; a = (int)(MJD.Days + MJD.FracDay + 2400000.5 + 0.5); b = a + 1537; c = (int)((1.0*b - 122.1) / (365.25)); d = (int)(365.25*c); e = (int)((b - d)*1.0 / 30.6001); UTDay = b - d - (int)(30.6001*e) + FRAC(MJD.Days + MJD.FracDay + 2400000.5 + 0.5); Common->Day = (int)(UTDay); Common->Month = e - 1 - 12 * (int)(e*1.0 / 14); Common->Year = c - 4715 - (int)((7 + Common->Month)*1.0 / 10.0); UT = (FRAC(UTDay) * 24.0); Common->Hour = int(MJD.FracDay * 24); Common->Minute = int((MJD.FracDay * 24 - Common->Hour) * 60); Common->Second = MJD.FracDay * 24 * 3600 - Common->Hour * 3600 - Common->Minute * 60; return true; } |
通用时到儒略日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | bool CommonTime2JDTime(const COMMONTIME Common, JDTIME*JD) { int y, m = 0; double TemptJD, UT = 0; if (Common.Month <= 2) { y = Common.Year - 1; m = Common.Month + 12; } if (Common.Month > 2) { y = Common.Year; m = Common.Month; } UT = Common.Hour + Common.Minute / 60.0 + Common.Second / 3600.0; TemptJD = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5; JD->Days = (int)(TemptJD); JD->FracDay = (TemptJD)-JD->Days; return true; } |
1.3.3儒略日与GPST
1.儒略日到GPST转换公式
先将儒略日转换为简化儒略日
MJD=JD+2400000.5
再从简化儒略日转换GPST
GPSWEEK=INT[(MJD-44244)/7]
SECOFWEEK=(MJD-44244-GPSWEEK×7)×86400
2.GPST到儒略日转换公式
MJD=44244+GPSWEEK×7+SECOFWEEK/86400
3.转换程序代码
儒略日到GPST
1 2 3 4 5 6 | bool JDTime2GPSTime(const JDTIME JD, GPSTIME*GPS) { GPS->Week = (int)((JD.Days + JD.FracDay - 2400000.5 - 44244) / 7.0); GPS->SecOfWeek = (JD.Days + JD.FracDay - 2400000.5 - 44244 - GPS->Week * 7) * 86400; return true; } |
GPST到儒略日
1 2 3 4 5 6 7 8 | bool GPSTime2JDTime(const GPSTIME GPS, JDTIME*JD) { double temptJD; temptJD = 44244 + GPS.Week * 7 + GPS.SecOfWeek / 86400 + 2400000.5; JD->Days = (int)(temptJD); JD->FracDay = FRAC(temptJD); return true; } |
1.3.4简化儒略日与通用时
1.简化儒略日到通用时转换公式
JD=MJD+2400000.5,
a=INT[JD+0.5]
b=a+1537
c=INT[(b-122.1)/365.25]
d=INT[365.25×c]
e=INT[(b-d)/30.6001]
Day=b-d-INT[30.6001×e]+FRAC[JD+0.5]
Month=e-1-12×INT[e/14]
Year=c-4715-INT[(7+M)/10]
Number=mod{INT[JD+0.5],7}(Number=0,Monday⋯Number=7,Sunday)
Hour=INT{FRAC[MJD]×24}
Minute=INT{FRAC[MJD]×24×60-Hour×60}
Second=INT{FRAC[MJD]×24×3600-Hour×3600-Minute×60}
2.通用时到简化儒略日转换公式
MJD=INT[365.25×y]+INT[30.6001×(m+1)]+Day+UT/24-679019
其中:
如果M≤2 ,则y=Year-1,m=Mouth+12
如果M>2 ,则y=Year,m=Mouth
UT表示世界时
3.转换程序代码
简化儒略日到通用时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | bool MJDTime2CommTime(const MJDTIME MJD, COMMONTIME*Common) { int a, b, c, d, e = 0; double UTDay = 0; double UT = 0; a = (int)(MJD.Days+MJD.FracDay + 2400000.5+0.5); b = a + 1537; c = (int)((1.0*b - 122.1) / (365.25)); d = (int)(365.25*c); e = (int)((b - d)*1.0 / 30.6001); UTDay = b - d - (int)(30.6001*e) + FRAC(MJD.Days + MJD.FracDay + 2400000.5 + 0.5); Common->Day = (int)(UTDay); Common->Month = e - 1 - 12 * (int)(e*1.0 / 14); Common->Year = c - 4715 - (int)((7 + Common->Month)*1.0 / 10.0); UT = (FRAC(UTDay) * 24.0); Common->Hour = int(MJD.FracDay * 24); Common->Minute = int((MJD.FracDay * 24 - Common->Hour) * 60); Common->Second = MJD.FracDay * 24 * 3600 - Common->Hour * 3600 - Common->Minute * 60; return true; } |
通用时到简化儒略日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | bool CommonTime2MJDTime(const COMMONTIME Common, MJDTIME*MJD) { int y, m = 0; double JD, UT = 0; JDTIME jd;
if (Common.Month<=2) { y = Common.Year - 1; m = Common.Month + 12; } if (Common.Month>2) { y = Common.Year; m = Common.Month; } UT = Common.Hour + Common.Minute / 60.0 + Common.Second / 3600.0; JD = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5; MJD->Days = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5-2400000.5; MJD->FracDay = (UT / 24.0 ) - (int)(UT / 24.0 );
return true; } |