UTC時間轉換北京時間


#include <stdio.h>
#include <time.h>

//UTC時間轉換為北京時間
_SysTime UTCToBeijing(_SysTime time)
{
uint16_t year=time.year+2000;
time.hour += 8;

if(time.month==1||time.month==3||time.month==5||time.month==7||time.month==8||time.month==10||time.month==12)//1,3,5,7,8,9,12月每月為31天
{
if(time.hour >= 24)
{
time.hour -= 24;time.day += 1;//如果超過24小時,減去24小時,后再加上一天
if(time.day > 31){time.day -= 31;time.month += 1;}//如果超過31一天,減去31天,后加上一個月
if(time.month > 12){time.month -= 12;year++;}//如果超過12月,應該是1月,然后加上一年
}
}
else if(time.month==4||time.month==6||time.month==9||time.month==11)//4,6,9,11月每月為30天
{
if(time.hour >= 24)
{
time.hour -= 24;time.day += 1;//如果超過24小時,減去24小時,后再加上一天
if(time.day > 30){time.day -= 30;time.month += 1;}//如果超過30一天,減去30天,后加上一個月
}
}
else//剩下為2月,閏年為29天,平年為28天
{
if(time.hour >= 24)
{
time.hour -= 24;time.day += 1;
if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//判斷是否為閏年,年號能被400整除或年號能被4整除,而不能被100整除為閏年
{if(time.day > 29){time.day -= 29;time.month += 1;}}//為閏年
else{if(time.day > 28){time.day -= 28;time.month += 1;}}//為平年
}
}
time.year = year - 2000;
return time;
}
//北京時間轉換為UTC時間
_SysTime BeijingToUTC(_SysTime time)
{
uint16_t year=time.year+2000;
if(time.hour >= 8)//如果小時大於等於8點,則減去小時即可
{
time.hour -= 8;
}
else
{
time.hour = time.hour + 24 - 8;time.day -= 1;//如果時間小於8點,則時間是前一天,然后日減一
if(time.month==1||time.month==2||time.month==4||time.month==6||time.month==8||time.month==9||time.month==11)//1,2,4,6,8,9,11月改成前一個月是31天
{
if(time.day == 0){time.day = 31;time.month -= 1;}//如果日是0,則應該是上個月最后一天,日改為31,月減一
if(time.month == 0){time.month = 12;year--;}//如果月為0,月就是12月,年減一
}
else if(time.month==5||time.month==7||time.month==10||time.month==12)//5,7,10,12上個月是30天
{
if(time.day == 0){time.day = 30;time.month -= 1;}//如果日是0,則應該是上個月最后一天,日改為30,月減一
}
else//剩下為3月,上個月閏年為29天,平年為28天
{
if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//判斷是否為閏年,年號能被400整除或年號能被4整除,而不能被100整除為閏年
{//為閏年
if(time.day == 0)
{
time.day = 29;
time.month -= 1;
}
}
else
{//為平年
if(time.day == 0)
{
time.day = 28;
time.month -= 1;
}
}
}
}
time.year = year - 2000;
return time;
}

void SetSysTimeFromUnix(time_t unix)
{
struct tm *p;
_SysTime time;
p=localtime(&unix);//轉換為unix時間
time.year = p->tm_year-100;//年需要減100
time.month = p->tm_mon+1;//0-11表示1-12月
time.day = p->tm_mday;
time.hour = p->tm_hour;
time.minute = p->tm_min;
time.second = p->tm_sec;
time = UTCToBeijing(time);//utc轉北京

RTC_TimeWR((uint8_t*)&time); //設置RTC時間

printf("網絡指令設置系統時間成功!\r\n");
//-----------------------------讀取時間 ---------------------------
RTC_TimeRD(&SystemDat.time.second);
printf("\r\nrtc time:20%02d-%02d-%02d %02d:%02d:%02d\t",SystemDat.time.year,SystemDat.time.month,SystemDat.time.day,SystemDat.time.hour,SystemDat.time.minute,SystemDat.time.second);

}
time_t GetUnixFromSysTime(_SysTime *time)
{
struct tm t;
time_t unix;
_SysTime time_t=*time;

time_t = BeijingToUTC(time_t);
//printf("\r\nrtc time:20%02d-%02d-%02d %02d:%02d:%02d\t",time_t.year,time_t.month,time_t.day,time_t.hour,time_t.minute,time_t.second);

t.tm_sec = time_t.second;
t.tm_min = time_t.minute;
t.tm_hour = time_t.hour;
t.tm_mday = time_t.day;
t.tm_mon = time_t.month-1;
t.tm_year = time_t.year+100;

unix = mktime(&t);//UTC時間轉unix
return unix;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM