打印
[DemoCode下载]

UTC时间转换为其他时区本地时间

[复制链接]
519|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uytyu|  楼主 | 2025-4-17 07:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
tc, ST, DA, TI, ar
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;
}


使用特权

评论回复
沙发
稳稳の幸福| | 2025-4-17 15:48 | 只看该作者
根据不同时区计算。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

3422

帖子

1

粉丝