UTC转换时间,测试过直接使用

#include "stdio.h"


typedef struct
{
    unsigned char     my_seconds;      
    unsigned char     my_minutes;   
    unsigned char     my_hour;  
    unsigned char     my_day;  
    unsigned char     my_month;   
  unsigned char     my_week;      
    unsigned int     my_years;   
}my_timejg;
 
static const unsigned int NonleapYearMonth[12] = { 31, 31 + 28, 31 + 28 + 31,  31 + 28 + 31 + 30,  31 + 28 + 31 + 30 + 31,  31 + 28 + 31 + 30 + 31 + 30,  31 + 28 + 31 + 30 + 31 + 30 + 31,  31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,  31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,  31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,  31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,  31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }; 

static const unsigned int LeapYearMonth[12] = { 31, 31 + 29, 31 + 29 + 31,  31 + 29 + 31 + 30,  31 + 29 + 31 + 30 + 31,  31 + 29 + 31 + 30 + 31 + 30,  31 + 29 + 31 + 30 + 31 + 30 + 31,  31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,  31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,  31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,  31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,  31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 };


unsigned char alg_IsLeapYear(unsigned int year)
{
    if((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) //能被4整除,不能被百整除,能被400整除。
    {
        return 1;                //闰年
    }
    else
    {
        return 0;                //平年
    }
}

my_timejg alg_Utc2LocalTime(unsigned int UtcVal, char TimeZone)
{
    unsigned int i = 0;
    my_timejg LocalTime;
    unsigned int Hour,Days,Year;

    
    LocalTime.my_seconds    =    UtcVal%60;                        //得到秒余数
    LocalTime.my_minutes    =    (UtcVal/60)%60;                //得到整数分钟数
    
    Hour    =    (UtcVal/60)/60;                                        //得到整数小时数
    LocalTime.my_hour    =    Hour%24+TimeZone;            //得到小时余数+时区
    if(LocalTime.my_hour>23)
    {
        LocalTime.my_hour-=24;
        Days=Hour/24+1;
    }
    else
    {
        Days=Hour/24;
    }
    LocalTime.my_week=(Days+4)%7;                            //计算星期,0-表示星期天        注:1970-1-1 是星期4

                                                    //注:400年=146097天,100年=36524天,4年=1461天
    Year = 1970;                                                            //utc时间从1970开始
    Year += (Days/146097)*400;

    Days %= 146097;                                                        //计算400年内的剩余天数
    Year += (Days/36525)*100;

    Days %= 36525; 
    Year += (Days/1461)*4;

    Days %= 1461;                                                            //计算4年内剩余天数,1970平1972闰年
    while( Days > 365)
    {
        if(alg_IsLeapYear(Year))
        {
            Days--;
        }
        Days -= 365;
        Year++;
    }
    if (!alg_IsLeapYear(Year) && (Days == 365) )
    {
        Year++;
        LocalTime.my_day    =1;        
        LocalTime.my_month    =1;
        LocalTime.my_years    =Year;
        return LocalTime;
    }
    LocalTime.my_years    =Year;
    LocalTime.my_month=0;
    LocalTime.my_day=0;
    if (alg_IsLeapYear(Year))                                    //本年是闰年
    {
        for (i = 0; i < 12; i++)
        {
            if (Days < LeapYearMonth[i])
            {
                LocalTime.my_month = i + 1;
                if (i == 0)
                {
                    LocalTime.my_day = Days;
                }
                else
                {
                    LocalTime.my_day = Days - LeapYearMonth[i - 1];
                }
                LocalTime.my_day++;
                return LocalTime;
            }
        }
    }
    else                                                                            //本年是平年
    {
        for (i = 0; i < 12; i++)
        {
            if (Days < NonleapYearMonth[i])
            {
                LocalTime.my_month  = i + 1;
                if (i == 0)
                {
                    LocalTime.my_day = Days;
                }
                else
                {
                    LocalTime.my_day = Days - NonleapYearMonth[i - 1];
                }
                LocalTime.my_day++;
                return LocalTime;
            }
        }
    }
    return LocalTime;
}


unsigned int  alg_LocalTime2Utc(my_timejg LocalTime, char TimeZone)
{
    unsigned int y = LocalTime.my_years -1970;                            //看一下有几个400年,几个100年,几个4年
    unsigned int dy = (y / 400);
    unsigned int days = dy *  (400 * 365 + 97);                        //400年的天数
    
    dy = (y % 400) / 100;
    days += dy * (100 * 365 + 25);                                        //100年的天数
    
    dy = (y % 100) / 4;
    days += dy * (4 * 365 + 1);                                                //4年的天数
    
    dy = y % 4;                                                                                //注意:这里1972是闰年,与1970只差2年
    days += dy * 365 ;

    if(dy == 3)                                                                                //这个4年里,有没有闰年就差1天    
    {
        days++;    //只有这个是要手动加天数的,因为1973年计算时前面的天数按365天算,1972少算了一天
    }
    
    if (LocalTime.my_month != 1)
    {
        if(alg_IsLeapYear(LocalTime.my_years))                                                //看看今年是闰年还是平年
        {
            days += LeapYearMonth[(LocalTime.my_month - 1) - 1];
        } 
        else 
        {
            days += NonleapYearMonth[(LocalTime.my_month  - 1) - 1];         //如果给定的月份数为x则,只有x-1个整数月
        }
    }
    days += LocalTime.my_day - 1;
    
    return (days * 24 * 3600 + ((unsigned int)LocalTime.my_hour - TimeZone)* 3600 + (unsigned int)LocalTime.my_minutes * 60 + (unsigned int)LocalTime.my_seconds);  
}


void main()
{
    my_timejg tmp;
    tmp.my_years=2020;
    tmp.my_month=9;
    tmp.my_day=26;
    tmp.my_hour=22;
    tmp.my_minutes=50;
    tmp.my_seconds=50;
    
        printf("%u\n",alg_LocalTime2Utc(tmp,8));
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值