调用 UTC_to_ZoneTime 函数,完成UTC到各时区的时间转换,入参参数解释如下:
- 参数1 utc_time: UTC时间对应的年月日时分秒。
- 参数2 timezone: 将要转换的时区,东加西减(例如中国为东八区,则传入8;夏威夷为西十区,则传入-10)
- 参数3 local_time: 转换后的当地时区时间对应的年月日时分秒。
代码如下:
typedef struct _nmea_time {
unsigned short year; //年份
unsigned char month; //月份
unsigned char date; //日期
unsigned char hour; //小时
unsigned char min; //分钟
unsigned char sec; //秒钟
} nmea_time;
void UTC_to_ZoneTime(const nmea_time* utc_time, int timezone, nmea_time* local_time)
{
int year, month, day, hour;
int lastday; //last day of this month.
int lastlastday; //last day of last month.
year = utc_time->year; //utc time.
month = utc_time->month;
day = utc_time->date;
hour = utc_time->hour + timezone;
/* Step0: Based on the current month, calculate the number of days in the current and last month */
if (1==month || 3==month || 5==month || 7==month || 8==month || 10==month || 12==month) {
lastday = 31;
lastlastday = 30;
if (3 == month) {
if ((0 == year%400) || ((0 == year%4) && (year%100 != 0))) { //if this is lunar year.
lastlastday = 29;
} else {
lastlastday = 28;
}
} else if ((1 == month) || (8 == month)) {
lastlastday = 31;
}
} else if (4==month || 6==month || 9==month || 11==month) {
lastday = 30;
lastlastday = 31;
} else {
lastlastday = 31;
if ((0 == year%400) || ((0 == year%4) && (year%100 != 0))) {
lastday = 29;
} else {
lastday = 28;
}
}
/* Step1: Based on the current time zone, calculate the local time */
if (hour >= 24) { // if >24, day+1
hour -= 24;
day += 1;
if (day > lastday) { // next month, day-lastday of this month
day -= lastday;
month += 1;
if (month > 12) { // next year , month-12
month -= 12;
year += 1;
}
}
} else if (hour < 0) { // if <0, day-1
hour += 24;
day -= 1;
if (day < 1) { // month-1, day=last day of last month
day = lastlastday;
month -= 1;
if (month < 1) { // last year , month=12
month = 12;
year -= 1;
}
}
}
/* Step2: Output the local_time */
local_time->year = year;
local_time->month = month;
local_time->date = day;
local_time->hour = hour;
local_time->min = utc_time->min;
local_time->sec = utc_time->sec;
}