前言
目前,我们解析到的美国惯导实验室的INS-D惯导的GPS时间是以伦敦格林尼治时间每周一的零点为起点,每周日的24点为终点的毫秒级时间。比如29551030,这个时间戳对于我们的使用是极不方便的。因此,需要对这个时间戳进行时间格式的转换。这一时间戳对应的伦敦时间是周一的8点12分31秒30毫秒,北京时间为周一的16点12分31秒30毫秒。
下文的函数即是实现这一转换。
关于伦敦时间如何转换北京时间,请参考我的另一篇博文GNSS时间时区转换。
一、头文件
gps2bjtime.h
为了便于统一时间格式,此头文件建立TIME结构体,用于储存周、天、北京时间等数据。
#ifndef GPS2BJTIME_H_
#define GPS2BJTIME_H_
typedef struct
{
int week = 0;
int day = 0;
double BJtime = 0.0;
double LDtime = 0.0;
}TIME;
#endif
数据解释:
- week表示周数,取值为0或1,-1表示输入数据无效(下同)。由于北京时间晚于伦敦时间8个小时,所以伦敦时间周日下午4点之后的时间对应的北京时间为下一周的周一时间,所以取值为1表示下个一周。
- day表示星期几,1到7表示星期一到星期日。
- BJtime表示转换后的北京时间,以123456.789为例,表示12时34分56秒789毫秒。时间格式为24小时制。
- LDtime表示转换后的伦敦时间,时间格式同上,但是这一时间暂无对应的星期和周数。
二、主函数
gps2bjtime.cpp
直接上代码。
#include "gps2bjtime.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
TIME gpstime2BJtime(int gpstime)
{
TIME time;
// Check if input is valid
if(gpstime < 0 || gpstime > 7 * 24 * 60 * 60 * 1000)
{
time.week = -1;
time.day = -1;
time.BJtime = -1;
time.LDtime = -1;
return time;
}
else
{
int one_day_in_ms = 24 * 60 * 60 * 1000;
int one_hour_in_ms = 60 * 60 * 1000;
int one_minute_in_ms = 60 * 1000;;
int one_second_in_ms = 1000;
// >>>>> Get day in a week
int day = gpstime / one_day_in_ms;
int ms_left = gpstime % one_day_in_ms;
if(day > 6 || day < 0) time.day = -1; // Out of range
else time.day = day + 1;
// >>>>> Get hour in a day
int hour = ms_left / one_hour_in_ms; // London time
ms_left = ms_left % one_hour_in_ms;
// >>>>> Get minutes in an hour
int minutes = ms_left / one_minute_in_ms;
ms_left = ms_left % one_minute_in_ms;
// >>>>> Get seconds in a minute
int seconds = ms_left / one_second_in_ms;
ms_left = ms_left % one_second_in_ms;
// >>>>> Integrite London time
double ld_time = hour * 1e4 + minutes * 1e2 + seconds + ms_left * 1e-3;
time.LDtime = ld_time;
// >>>>> Time Zone conversion
int time_zone = 8; // Beijing is 8 hour late of London time
if(hour + time_zone > 23)
{
time.day += 1;
hour = hour + time_zone - 24;
if(time.day > 6)
{
time.week = 1;
time.day -= 7;
}
else time.week = 0;
}
else
{
hour += time_zone;
}
// >>>>> Integrite BJ time
double bj_time = hour * 1e4 + minutes * 1e2 + seconds + ms_left * 1e-3;
time.BJtime = bj_time;
return time;
}
}
int main()
{
TIME time;
time = gpstime2BJtime(29551030);
cout<<"LDtime = "<<fixed<<setprecision(3)<<time.LDtime<<endl;
cout<<"week = "<<time.week<<endl;
cout<<"day = "<<time.day<<endl;
cout<<"BJtime = "<<fixed<<setprecision(3)<<time.BJtime<<endl;
return 0;
}
输出如下:
LDtime = 81231.030
week = 0
day = 1
BJtime = 161231.030
三、讨论
欢迎大家对该函数的代码进行讨论。欢迎大家对我的代码提出修改意见。