一、前言
在卫星导航定位中,时常用到时间系统的转换,本文使用C++语言,编程实现各种时间系统的相互转换。
1.时间与卫星导航定位的关系:
①计算卫星位置、速度
②计算信号的传播时间
③计算卫星到接收机天线之间的距离
2.时间变量截断误差对精度的影响
①计算卫星位置(1E-6)
②计算地面用户的位置
③信号传播时间的影响(1E-10或更低)
二、计时法与结构体定义
1.通用计时法(日历表示法):
表示方法:年、月、日、时、分、秒
特点:· 反映季节变化, 与日常生活密切相关
· 非连续, 不利于数学表达和科学计算
struct Commontime
{
unsigned short Year;
unsigned short Month;
unsigned short Day;
unsigned short Hour;
unsigned short Minute;
double Second;
};//通用时
2.儒略日
①儒略日(Julian Day)
/ 定义
· 是指从 4712 年1 月1 日( 即公元前4713 年1 月1 日) 正午开始的天数
/ 提出
· 由J .J.scaliger 在巧83 年提出的, 所以该系统的名称源自JuhusScaliger ( 注意, 不是Julius Caesar)
/ 特点
· 连续的, 利于数学表达
· 不直观
②简化儒略日(MJD)
定义:从儒略日中减去2,400,000.5,天来得到, 给出的是从1858 年11 月17 日子夜开始的天数
特点:
· 连续的, 利于数学表达
· 数值比儒略日小
struct MJDtime
{
int Day;
double FracDay;
MJDtime()
{
Day = 0;
FracDay = 0.0;
};
};//简化儒略日
3.GPS时
定义
以1980年1月6日子夜为起点,用周数和周内的秒数来表示
特点
GPS系统内部计时法
struct GPStime
{
unsigned short GPSweek;
double secofweek;
GPStime()
{
GPSweek = 0;
secofweek = 0.0;
}
};//GPS时
三、常用时间表示法转换算法
1.通用时到简化儒略日的转换算法
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 [ ] 表示取实数的整数部分。
2.儒略日到通用时的转换算法
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]
D=b-d-INT[30.6001*e]+FRAC[JD+0.5](日,包含小数部分)
M=e-1-12*INT[e/14](月)
Y=c-4715-INT[(7+M)/10](年)
N=mod{INT[JD+0.5],7}(星期几。N=0,星期一;N=1,星期二)
3.简化儒略日到GPS时的转换算法
GPS 时的起点为1980 年1 月6 日0 点, 其MJD 时间表示为44244
GPS 周
GPSWEEK =INT [ MJD 一44244 ) / 7 ]
GPS 周秒
SECOFWEEK = (MJD 一44244 一GPSWEEK * 7 )* 86400
4.GPS时到简化儒略日的转换算法
MJD=44244+GPSWEEK*7+SECOFWEEK/86400
5.通用时与GPS时的转换算法
由通用时转换到GPS 时间
第一步: 由通用时转换到简化儒略日
第二步: 有简化儒略日转换到GPS 时
由GPS 时间转换到通用时
第一步: 由GPS 时间转换到儒略日
第二步: 由儒略日转换到通用时
四、时间转换函数设计
1.通用时到简化儒略日
//通用时转儒略日
double CT2MJD(Commontime& C)
{
double JD = 0;
double MJD = 0;
double UT = 0;
int y = 0;
int m = 0;
if (C.Month <= 2)
{
y = C.Year - 1;
m = C.Month + 12;
}
UT = C.Hour + C.Minute / 60.0 + C.Second / 3600.0;//世界时
JD = int(365.25*y) + int(30.6001*(m + 1)) + C.Day + UT / 24 + 1720981.5;
MJD = JD - 2400000.5;
return MJD;
}
2.简化儒略日到通用时
void MJD2CT(Commontime& C,double MJD)
{
double JD = MJD + 2400000.5;
double F = JD - int(JD + 0.5);//日的小数部分
double a = int(JD + 0.5);//
double b = a + 1537;
double c = int((b - 122.1) / 365.25);
double d = int(365.25*c);
double e = int((b - d) / 30.6001);
C.Day = b - d - int(30.6001*e);//日
C.Month = e - 1 - 12 * int(e / 14);//月
C.Year = c - 4715 - int((7 + C.Month) / 10);//年
C.Hour = int(F * 24);
C.Minute = int((F * 24 - C.Hour) * 60);
C.Second = ((F * 24 - C.Hour) * 60 - C.Minute) * 60;
}
3.其它时间系统相互转换程序设计:
GPS时到MJD的转换
MJD到GPS时的转换
GPS时到通用时的转换
通用时到GPS时的转换
五、BDS时
BDS 时(BDS Time )
/ 定义
· 以2006 年1 月1 日UTC 00时00分00秒为起点, MJD 时间表示
为53736
· 也可用周数和周内的秒数来表示
· 与GPST 的基本关系
gt.Week = bt.Week + 1356
gt.Sec= bt.Sec + 14
将北斗时转换成GPS时之后又可以进行与其它时间系统相互转换。
//GPS时转北斗时
void GPST2BDST(GPStime& G,BDStime& B)
{
B.BDSweek = G.GPSweek - 1356;
B.sec = G.secofweek - 14;
}
六、结语
本次内容分享到这里了,如有问题,欢迎大家一起讨论
完整源代码见(只需1积分即可获取):通用时、儒略日、GPS时转换算法和大地坐标与空间直角坐标转换算法资源-CSDN文库