时间字符串转time_t

方法一:

//指定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;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值