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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#可以用于GNSS时间转换。在卫星导航领域,GNSS时间转换涉及格里高利日期、儒略日、年积日和天内秒等概念。可以使用C#编程语言进行这些转换操作。虽然本人的C#基础相对较弱,因此代码可能会比较冗长。格里高利历日期的格式为年(Y) 月(M) 日(D) 时(h) 分(m) 秒(s),儒略日的格式为儒略日(JD)和约化儒略日(MJD)。不同时间系统的格里高利历标识法和儒略日标识法之间的转换公式是相同的。 GNSS是Global Navigation Satellite System的缩写,中文译名为全球导航卫星系统,目前包括美国的GPS、俄罗斯的GLONASS、中国的北斗系统和欧盟的Galileo系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [通过C#实现卫星导航GNSS时间变换](https://blog.csdn.net/chartty/article/details/129763728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C#接收GNSS NMEA0813协议数据](https://blog.csdn.net/kenjianqi1647/article/details/84779729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值