方法一:
//指定time_t类型的时间,格式化为YYYYMMDDHH24MISS型的字符串
void FormatTime(time_t time1, char *szTime)
{
struct tm tm1;
#ifdef WIN32
tm1 = *localtime(&time1);
#else
localtime_r(&time1, &tm1 );
#endif
sprintf( szTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",
tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday,
tm1.tm_hour, tm1.tm_min,tm1.tm_sec);
}
//指定YYYYMMDDHH24MISS型的时间,格式化为time_t型的时间
time_t FormatTime2(char * szTime)
{
struct tm tm1;
time_t time1;
sscanf(szTime, "%4d%2d%2d%2d%2d%2d",
&tm1.tm_year,
&tm1.tm_mon,
&tm1.tm_mday,
&tm1.tm_hour,
&tm1.tm_min,
&tm1.tm_sec);
tm1.tm_year -= 1900;
tm1.tm_mon --;
tm1.tm_isdst=-1;
time1 = mktime(&tm1);
return time1;
}
方法二:
在程序中,我们经常性的会使用到时间格式的转化,比如讲time_t转化成string,或者反过来转,下面就是实现的代码。分为 2009-3-24 和 2009-3-24 0:00:08两种时间格式。
时间格式:2009-3-24 :
#include <sys/time.h>
/*
string to time_t
时间格式 2009-3-24
*/
int API_StringToTime(const string &strDateStr,time_t &timeData)
{
char *pBeginPos = (char*) strDateStr.c_str();
char *pPos = strstr(pBeginPos,"-");
if(pPos == NULL)
{
return -1;
}
int iYear = atoi(pBeginPos);
int iMonth = atoi(pPos + 1);
pPos = strstr(pPos + 1,"-");
if(pPos == NULL)
{
return -1;
}
int iDay = atoi(pPos + 1);
struct tm sourcedate;
bzero((void*)&sourcedate,sizeof(sourcedate));
sourcedate.tm_mday = iDay;
sourcedate.tm_mon = iMonth - 1;
sourcedate.tm_year = iYear - 1900;
timeData = mktime(&sourcedate);
return 0;
}
/*
time_t to string
*/
int API_TimeToString(string &strDateStr,const time_t &timeData)
{
char chTmp[15];
bzero(chTmp,sizeof(chTmp));
struct tm *p;
p = localtime(&timeData);
p->tm_year = p->tm_year + 1900;
p->tm_mon = p->tm_mon + 1;
snprintf(chTmp,sizeof(chTmp),"%04d-%02d-%02d",
p->tm_year, p->tm_mon, p->tm_mday);
strDateStr = chTmp;
return 0;
}
时间格式 2009-3-24 0:00:08 :
/*
string to time_t
时间格式 2009-3-24 0:00:08 或 2009-3-24
*/
int API_StringToTimeEX(const string &strDateStr,time_t &timeData)
{
char *pBeginPos = (char*) strDateStr.c_str();
char *pPos = strstr(pBeginPos,"-");
if(pPos == NULL)
{
printf("strDateStr[%s] err \n", strDateStr.c_str());
return -1;
}
int iYear = atoi(pBeginPos);
int iMonth = atoi(pPos + 1);
pPos = strstr(pPos + 1,"-");
if(pPos == NULL)
{
printf("strDateStr[%s] err \n", strDateStr.c_str());
return -1;
}
int iDay = atoi(pPos + 1);
int iHour=0;
int iMin=0;
int iSec=0;
pPos = strstr(pPos + 1," ");
//为了兼容有些没精确到时分秒的
if(pPos != NULL)
{
iHour=atoi(pPos + 1);
pPos = strstr(pPos + 1,":");
if(pPos != NULL)
{
iMin=atoi(pPos + 1);
pPos = strstr(pPos + 1,":");
if(pPos != NULL)
{
iSec=atoi(pPos + 1);
}
}
}
struct tm sourcedate;
bzero((void*)&sourcedate,sizeof(sourcedate));
sourcedate.tm_sec = iSec;
sourcedate.tm_min = iMin;
sourcedate.tm_hour = iHour;
sourcedate.tm_mday = iDay;
sourcedate.tm_mon = iMonth - 1;
sourcedate.tm_year = iYear - 1900;
timeData = mktime(&sourcedate);
return 0;
}
/*
time_t to string 时间格式 2009-3-24 0:00:08
*/
int API_TimeToStringEX(string &strDateStr,const time_t &timeData)
{
char chTmp[100];
bzero(chTmp,sizeof(chTmp));
struct tm *p;
p = localtime(&timeData);
p->tm_year = p->tm_year + 1900;
p->tm_mon = p->tm_mon + 1;
snprintf(chTmp,sizeof(chTmp),"%04d-%02d-%02d %02d:%02d:%02d",
p->tm_year, p->tm_mon, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
strDateStr = chTmp;
return 0;
}
所有的代码都经过测试,不会有内存泄漏和句柄泄漏,可以放心使用~
另附:
结构tm的定义为:
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒数,正常范围为0-59,但允许至61秒
int tm_min 代表目前分数,范围0-59
int tm_hour 从午夜算起的时数,范围为0-23
int tm_mday 目前月份的日数,范围01-31
int tm_mon 代表目前月份,从一月算起,范围从0-11
int tm_year 从1900 年算起至今的年数
int tm_wday 一星期的日数,从星期一算起,范围为0-6
int tm_yday 从今年1月1日算起至今的天数,范围为0-365
int tm_isdst 日光节约时间的旗标
time_t parseDateToLocalTM(std::string strDate)
{
//time_t cur_ts = time(NULL);
//struct tm* local_tm = localtime(&cur_ts);
struct tm st_tm = {0};
std::string::size_type pos = 0, start = 0;
std::string tmp;
pos = strDate.find_first_of("- :", start);
tmp = strDate.substr(start, pos);
st_tm.tm_year = atoi(tmp.c_str()) - 1900;
start = pos + 1;
pos = strDate.find_first_of("- :", start);
tmp = strDate.substr(start, pos - start);
st_tm.tm_mon = atoi(tmp.c_str()) - 1;
start = pos + 1;
pos = strDate.find_first_of("- :", start);
tmp = strDate.substr(start, pos - start);
st_tm.tm_mday = atoi(tmp.c_str());
start = pos + 1;
pos = strDate.find_first_of("- :", start);
tmp = strDate.substr(start, pos - start);
st_tm.tm_hour = atoi(tmp.c_str());
st_tm.tm_min = 0;
st_tm.tm_sec = 0;
st_tm.tm_isdst = -1; // let system to guess dst value
time_t ts = mktime(&st_tm);
return ts;