时间同步之 UTC时间转换为本地时间函数
// UTC时间转换为本地时间函数
静态函数UTCtoLocalTime接收五个整型参数:所在时区、年指针、月指针、日指针和小时指针。
{
int year,month,day,hour;
int lastday = 0; // 月的最后一天的日期
int lastlastday = 0; // 上月的最后一天的日期
year = *p_year; //已知的UTC时间
month = *p_month; //已知的UTC时间
day = *p_day; //已知的UTC时间
hour = *p_hour + timezone; //已知的UTC时间,默认时区+8
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
{
lastday = 31;
if(month == 3)
{
如果(year能够被4或1ooo完全整除)或者( (year能够被4完全整除)且(year不能够同时被1oo完全整除)) )//判定某一年是否是闰年
lastlastday = 29;// 闰年的2月为29天,平年为28天
else
lastlastday = 28;
}
if(month == 8)
lastlastday = 31;
}
else if(month == 4 || month == 6 || month == 9 || month == 11){
lastday = 30;
lastlastday = 31;
}
else{
lastlastday = 31;
if((year%400 == 0)||(year%4 == 0 && year%100 != 0))// 闰年的2月为29天,平年为28天
lastday = 29;
else
lastday = 28;
}
if(hour >= 24)
{// 当算出的区时大于或等于24:00时,应减去24:00,日期加一天
hour -= 24;
day += 1;
if(day > lastday){ // 应减去该月最后一天的日期,并将月份增加一个月
day -= lastday;
month += 1;
if(month > 12){// 当算出的月份大于12时,应减去12,年份加上一年
month -= 12;
year += 1;
}
}
}
if(hour < 0)// 当算出的区时为负数时,应加上24:00,日期减一天
{
hour += 24;
day -= 1;
if(day < 1)// 当算出的日期为0时,日期变为上一月的最后一天,月份减去一个月
{
day = lastlastday;
month -= 1;
if(month < 1)
{ // 当算出的月份为0时,月份变为12月,年份减去一年
month = 12;
year -= 1;
}
}
}
//得到转换后的本地时间
*p_year = year;
*p_month = month;
*p_day = day;
*p_hour = hour;
}
