自己写 localtime 函数(含完整注释,代码)转载
localtime()在多線程中使用的少的時候是不會出錯的
現(xiàn)localtime和ctime等函數(shù)在linux中的返回值均存放在一個靜態(tài)區(qū)中,即TLS變量。如果在多線程程序中比較頻繁的調(diào)用此函數(shù),則可能出現(xiàn)內(nèi)容錯亂的情況。
//曾在某平臺下多線程中使用localtime庫函數(shù)。可惡的是,每當程序運行
//一段時間后,都要出現(xiàn)內(nèi)存泄露。查了數(shù)個夜晚為什么,無從斷定。
//只能狠狠心,自己寫了個localtimes,功能與localtime庫函數(shù)相同。
//有了它以后,我就不再因內(nèi)存泄露而煩惱了。
//要知道“內(nèi)存泄露”是程序員大的一大恥辱。
//這個localtimes在多線程下已經(jīng)運行了3年,還沒發(fā)生問題,放心使用。
//一年中每個月的天數(shù),非閏年
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;
????//四年中剩下的小時數(shù)
????time?%=?1461L?*?24L;
????//校正閏年影響的年份,計算一年中剩下的小時數(shù)
????for?(;;)
????{
????????//一年的小時數(shù)
????????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;
????}
????//小時數(shù)
????tm_time->tm_hour=(int)(time?%?24);
????//一年中剩下的天數(shù)
????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;
}
轉(zhuǎn)載于:https://www.cnblogs.com/aixingfou/archive/2011/07/13/2105672.html
總結(jié)
以上是生活随笔為你收集整理的自己写 localtime 函数(含完整注释,代码)转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL时间格式转换CONVERT_GET
- 下一篇: asp.net 验证码