代码说明
一般情况下,从惯导设备或者卫星定位获取的时间都是以英国格林尼治时间为准的,即时区为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;
}
讨论
欢迎大家对该函数的代码进行讨论。欢迎大家对我的代码提出修改意见。
后续的改进方向为增加西区时区的转换。