[C语言] UTC时间转换为其他时区本地时间

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值