自己写 localtime 函数(含完整注释,代码)
//对时间转换有兴趣的可以看看。
//曾在某平台下多线程中使用localtime库函数。可恶的是,每当程序运行 //一段时间后,都要出现内存泄露。查了数个夜晚为什么,无从断定。 //只能狠狠心,自己写了个localtimes,功能与localtime库函数相同。 //有了它以后,我就不再因内存泄露而烦恼了。 //要知道“内存泄露”是程序员大的一大耻辱。//这个localtimes在多线程下已经运行了3年,还没发生问题,放心使用。 //一年中每个月的天数,非闰年 const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /*++------------------------------------------------------------------------ Function: localtimes Modification History Jurassic 2002.1 Created. --------------------------------------------------------------------------*/ void __stdcall localtimes( time_t time, long timezone, struct tm *tm_time ) { unsigned __int32 n32_Pass4year; __int32 n32_hpery; //计算时差 time=time-timezone; if(time < 0) { time = 0; } //取秒时间 tm_time->tm_sec=(int)(time % 60); time /= 60; //取分钟时间 tm_time->tm_min=(int)(time % 60); time /= 60; //取过去多少个四年,每四年有 1461*24 小时 n32_Pass4year=((unsigned int)time / (1461L * 24L)); //计算年份 tm_time->tm_year=(n32_Pass4year << 2)+70; //四年中剩下的小时数 time %= 1461L * 24L; //校正闰年影响的年份,计算一年中剩下的小时数 for (;;) { //一年的小时数 n32_hpery = 365 * 24; //判断闰年 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 ; } } } //计算月日 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; }
|