天天看點

C++常見的時間轉化函數

一、定義自定義的時間格式MYtime

  struct tm使用不友善,自定義時間格式MYtime友善顯示。

 struct MYtime

{

    int m_iSec;     

    int m_iMin;     

    int m_iHour;

    int m_iDay;     

    int m_iMon;     

    int m_iYear;

    int m_iIsdst;

    MYtime()

    {

        m_iSec = 0;     

        m_iMin = 0;          

        m_iHour = 0;     

        m_iDay = 0;     

        m_iMon = 0;     

        m_iYear = 0;     

        m_iIsdst = 0;

    };

    MYtime(int iYear, int iMon, int iDay,int iHour,int iMin,int iSec = 0)

    {

        m_iSec = iSec;     

        m_iMin = iMin;          

        m_iHour = iHour;     

        m_iDay = iDay;     

        m_iMon = iMon;     

        m_iYear = iYear;     

        m_iIsdst = 0;

    };

};

二、MYtime轉化為tm格式

};

//MYtime轉化為tm格式

void MYtimeToTM(const MYtime& oMytime, struct tm& oTM)

{

    oTM.tm_sec  = oMytime.m_iSec;  

    oTM.tm_min = oMytime.m_iMin;   

    oTM.tm_hour = oMytime.m_iHour; 

    oTM.tm_mday = oMytime.m_iDay;  

    oTM.tm_mon = oMytime.m_iMon - 1 ;  

    oTM.tm_year = oMytime.m_iYear - 1900 ;

    oTM.tm_isdst = oMytime.m_iIsdst;

}

//tm格式轉換為MYtime

void TMToMYtime(const struct tm& oTM,MYtime& oMytime)

{

    oMytime.m_iSec = oTM.tm_sec;  

    oMytime.m_iMin = oTM.tm_min;   

    oMytime.m_iHour = oTM.tm_hour; 

    oMytime.m_iDay = oTM.tm_mday;  

    oMytime.m_iMon = oTM.tm_mon + 1;  

    oMytime.m_iYear = oTM.tm_year + 1900;

    oMytime.m_iIsdst= oTM.tm_isdst;

}

三、定義固定格式的時間string,友善存儲

 為了和上面的友善,定義兩個轉化函數

bool MYtimeToStr(const MYtime &oMytime,std::string& strTime)

{

    char szBuf[20] = { 0};//時間最多不超過20位

    int iRet = sprintf(szBuf, "%4d-%2d-%2d %2d:%2d",    

        oMytime.m_iYear,

        oMytime.m_iMon,

        oMytime.m_iDay,

        oMytime.m_iHour,

        oMytime.m_iMin);

    if(iRet < 5)//表示時間格式錯,不能正确地讀取到秒??m_iSec

    {

        return false;

    }

    strTime = szBuf;

    return true;

}

四、好多時間格式,還分GMT、Local,好亂,理一理

 /時間轉化的順序:  MYtimeToStr           MYtime(可了解的) <--> String(可了解的)    StrToMYtime

                    MYtimeToTM            MYtime<-->struct tm                           TMToMYtime

                    mktime                struct tm <--->time_t(long)                 gmtime,localtime

                    struct tm -->mktime-->time_t(local)

                    struct tm -->mktime--> -_timezone --> time_t(gmt?)

五、根據使用場景定義的兩組轉化函數

//場景一:

//資料庫和傳輸時使用time_t(gmt) 時間,界面顯示使用MYtime(local)

//界面顯示<-->資料庫和傳輸:    MYtime(local) <---> struct tm(local)    <--->  time_t(long)

//                                MYtimeToTM-->mktime

//                                TMToMYtime<--localtime

bool LOCMytimeToGMTCalender(const MYtime& oLOCMytime,time_t &oGMTCalender)

{

    struct tm oLOCTM;

    MYtimeToTM(oLOCMytime,oLOCTM);

    oGMTCalender = mktime(&oLOCTM);

    if(-1 == oGMTCalender)

    {

        return false;

    }

    return true;

}

bool GMTCalenderToLOCMytime(const time_t oGMTCalender, MYtime& oLOCMytime)

{

    struct tm *pLOCTM = NULL;

    pLOCTM = localtime(&oGMTCalender);

    if(NULL == pLOCTM)

    {

        return false;

    }

    TMToMYtime(*pLOCTM,oLOCMytime);

    return true;

}

//場景二:

//資料庫和傳輸是使用String(gmt)時間,界面顯示使用MYtime(local)

//界面顯示<-->資料庫和傳輸:    MYtime(local) <---> struct tm(local)<---> time_t(long) <---> struct tm(gmt)<--->  MYtime(gmt)<-->String(gmt)

//                                            MYtimeToTM        -->         mktime            -->  gmtime        -->        TMToMYtime    -->      MYtimeToStr

//                                            TMToMYtime        <--         localtime        <--  -_timezone mktime        <--        MYtimeToTM    <--      StrToMYtime

bool GMTStrToLOCMytime(const std::string& strGMTStr, MYtime& oLOCMytime)

{

    MYtime oGMTMytime;

    if(!StrToMYtime(strGMTStr,oGMTMytime))

    {

        return false;

    }

    struct tm oGMTTM;

    MYtimeToTM(oGMTMytime, oGMTTM);

    time_t lLocTime = mktime(&oGMTTM);

    if(-1 == lLocTime)

    {

        return false;

    }

    lLocTime -= _timezone;//很關鍵

    struct tm *pLOCTM = NULL;

    pLOCTM = localtime(&lLocTime);

    if(NULL == pLOCTM)

    {

        return false;

    }

    TMToMYtime(*pLOCTM,oLOCMytime);

    return true;

}

bool LOCMytimeToGMTStr(const MYtime& oLOCMytime,std::string& strGMTStr)

{

    struct tm oLOCTM;

    MYtimeToTM(oLOCMytime,oLOCTM);

    time_t lTime = mktime(&oLOCTM);

    if(-1 == lTime)

    {

        return false;

    }

    struct tm *pGMTTM = NULL;

    pGMTTM = gmtime(&lTime);

    if(NULL == pGMTTM)

    {

        return false;

    }

    MYtime oGMTMYtime;

    TMToMYtime(*pGMTTM,oGMTMYtime);

    if(!MYtimeToStr(oGMTMYtime,strGMTStr))

    {

        return false;

    }

    return true;

}

六、附帶的單元測試

int _tmain(int argc, _TCHAR* argv[])

{

    //std::string strTime="2008-8-8 12:33";

    //std::string strTime="2008-08-08 12:33";

    //std::string strTime="2008-d8-08 12:33";

    std::string strTime="2008-8-08 12:33";

    MYtime mytm;

    StrToMYtime(strTime,mytm);

    //MYtime oMytime2(2008,8,8,12,33);

    MYtime oMytime2(308,8,8,12,33);

    std::string strTime2;

    MYtimeToStr(oMytime2,strTime2);

    //場景二的兩個時間轉化函數

    std::string strGMTStr = "2008-8-8 12:33";

    MYtime oLOCMytime;

    GMTStrToLOCMytime(strGMTStr, oLOCMytime);

    std::string strGMTStr2;

    MYtime oLOCMytime2(2008,8,8,12,33);

    LOCMytimeToGMTStr(oLOCMytime2 ,strGMTStr2);

    //場景一

    MYtime oLOCMytime3(2008,8,8,12,33);

    time_t oGMTCalender=0;

    LOCMytimeToGMTCalender(oLOCMytime3, oGMTCalender);

    time_t oGMTCalender2=0;

    oGMTCalender2 = time(NULL);

    MYtime oLOCMytime4;

    GMTCalenderToLOCMytime(oGMTCalender2,oLOCMytime4 );

    return 0;

}