- 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;
- }
|