一、定义自定义的时间格式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;
}