C++常见的时间转化函数

一、定义自定义的时间格式MYtime
  struct tm使用不方便,自定义时间格式MYtime方便显示。
 struct MYtime
{
    int m_iSec;     /* = int tm_sec;    tm seconds after the minute - [0,59] */
    int m_iMin;     /* = int tm_min;    tm minutes after the hour - [0,59] */
    int m_iHour; /* = int tm_hour;   tm hours since midnight - [0,23] */
    int m_iDay;     /* = int tm_mday;   tm  day of the month - [1,31] */
    int m_iMon;     /* m_iMon = tm_mon+1 int tm_mon;    tm months since January - [0,11] */
    int m_iYear; /* m_iYear = tm_year + 1900 int tm_year;   tm years since 1900 */
         /* int tm_wday;   tm days since Sunday - [0,6] */
         /* int tm_yday;   tm days since January 1 - [0,365] */
    int m_iIsdst; /* m_iIsdst= int tm_isdst;  tm daylight savings time flag */
    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;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值