通用时、儒略日、GPS时的相互转换程序设计(C++)

一、前言

在卫星导航定位中,时常用到时间系统的转换,本文使用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;
	}

 六、结语

本次内容分享到这里了,如有问题,欢迎大家一起讨论

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值