GNSS时间时区转换

GNSS时间时区转换

代码说明

一般情况下,从惯导设备或者卫星定位获取的时间都是以英国格林尼治时间为准的,即时区为0。而我们使用的时间一般是北京时间,即东八区的时间。所以要对GNSS时间进行时区转换。
对于0:00-15:59时间段的GNSS时间,北京时间直接在hour上加8即可。但是对16:00-23:59时间段的时间,还需要考虑当前的day是否为每月的最后一天,当前的month是否为每年的最后一月以及当前年是否为闰年等情况。

代码

参数说明:
GNSS_Year:GNSS时间中的年
GNSS_Month:GNSS时间中的月
GNSS_Day:GNSS时间中的天
GNSS_Hour:GNSS时间中的小时
time_zone:时区。此函数仅考虑需要转换的时间位于东区,即时区大于0的情况。

函数输出为vector是函数在我的代码中的使用需要,用户可以按照需要进行自行修改。

vector<int> TimeZoneConversion(int GNSS_Year, int GNSS_Month, int GNSS_Day, int GNSS_Hour, int time_zone)
{
    vector<int> time;
    assert(time_zone >= 0);

    if(GNSS_Hour + time_zone >= 24)
    {
        GNSS_Hour += time_zone - 24;
        // If it is the last day of month with 31 days
        if(GNSS_Day == 31)
        {
            // If it is the last day of the year
            if(GNSS_Month == 12)    
            {
                GNSS_Year += 1;
                GNSS_Month = 1;  
                GNSS_Day = 1;                   
            }
            // If it is a solar month of 31 days
            else
            {
                GNSS_Month += 1; 
                GNSS_Day = 1;      
            }
        }
        // If it is the last day of month with 30 days
        else if(GNSS_Day == 30)    
        {
            // If it is a solar month of 31 days
            if(GNSS_Month == 4 || GNSS_Month == 6 || GNSS_Month == 9 || GNSS_Month == 11)
            {
                GNSS_Month += 1; 
                GNSS_Day = 1; 
            }
            else
            {
                GNSS_Day += 1;  
            }
        }
        // If it is February
        else if(GNSS_Month == 2)    
        {
            // Check leap year
            // If the year can be divisible by 4, it's mostly likely a leap year, two exceptions are as follows:
            // If the year can be divisible by 3200, it's not a leap year
            // If the year can be divisible by 100 and can not be divisible by 400, it's not a leap year
            bool is_leap_year = false;
            if(GNSS_Year % 3200 == 0 || (GNSS_Year % 100 == 0 && GNSS_Year % 400 != 0) || GNSS_Year % 4 != 0)
            {
                is_leap_year = false;
            }
            else if(GNSS_Year % 4 == 0)
            {
                is_leap_year = true;
            }
            else
            {
                is_leap_year = false;
            }


            // Check the last day of feb in leap year
            if(is_leap_year && GNSS_Day == 29)
            {
                GNSS_Month += 1;
                GNSS_Day = 1;
            }
            // Check the last day of feb in non leap year
            else if(!is_leap_year && GNSS_Day == 28)
            {
                GNSS_Month += 1;
                GNSS_Day = 1;
            }
            else
            {
                GNSS_Day += 1;
            }
        }    
        else
        {
            GNSS_Day += 1;
        }    
    }
    else
    {
        GNSS_Hour += time_zone;
    }        

    time.push_back(GNSS_Year);
    time.push_back(GNSS_Month);
    time.push_back(GNSS_Day);
    time.push_back(GNSS_Hour);

    return time;  
}

讨论

欢迎大家对该函数的代码进行讨论。欢迎大家对我的代码提出修改意见。
后续的改进方向为增加西区时区的转换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值