struct tm * my_localtime_r(const time_t *srctime,struct tm *tm_time)
{
long int n32_Pass4year,n32_hpery;
// 每個月的天數 非閏年
const static char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 一年的小時數
const static int ONE_YEAR_HOURS = 8760; // 365 * 24 (非閏年)
//計算時差8*60*60 固定北京時間
time_t time = *srctime;
time=time+28800;
tm_time->tm_isdst=0;
if(time < 0)
{
time = 0;
}
//取秒時間
tm_time->tm_sec=(int)(time % 60);
time /= 60;
//取分鐘時間
tm_time->tm_min=(int)(time % 60);
time /= 60;
//計算星期
tm_time->tm_wday=(time/24+4)%7;
//取過去多少個四年,每四年有 1461*24 小時
n32_Pass4year=((unsigned int)time / (1461L * 24L));
//計算年份
tm_time->tm_year=(n32_Pass4year << 2)+70;
//四年中剩下的小時數
time %= 1461L * 24L;
//計算在這一年的天數
tm_time->tm_yday=(time/24)%365;
//校正閏年影響的年份,計算一年中剩下的小時數
for (;;)
{
//一年的小時數
n32_hpery = ONE_YEAR_HOURS;
//判斷閏年
if ((tm_time->tm_year & 3) == 0)
{
//是閏年,一年則多24小時,即一天
n32_hpery += 24;
}
if (time < n32_hpery)
{
break;
}
tm_time->tm_year++;
time -= n32_hpery;
}
//小時數
tm_time->tm_hour=(int)(time % 24);
//一年中剩下的天數
time /= 24;
//假定爲閏年
time++;
//校正潤年的誤差,計算月份,日期
if ((tm_time->tm_year & 3) == 0)
{
if (time > 60)
{
time--;
}
else
{
if (time == 60)
{
tm_time->tm_mon = 1;
tm_time->tm_mday = 29;
return tm_time;
}
}
}
//計算月日
for (tm_time->tm_mon = 0;Days[tm_time->tm_mon] < time;tm_time->tm_mon++)
{
time -= Days[tm_time->tm_mon];
}
tm_time->tm_mday = (int)(time);
return tm_time;
}