GPS时间转北京时间


前言

目前,我们解析到的美国惯导实验室的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

三、讨论

欢迎大家对该函数的代码进行讨论。欢迎大家对我的代码提出修改意见。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值