天天看点

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;

}