1. 程式人生 > >自己寫 localtime 函式(含完整註釋,程式碼)

自己寫 localtime 函式(含完整註釋,程式碼)

自己寫 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;

}