您的当前位置:首页Linux C/C++时间字符串与time_t之间的转换方法(转)

Linux C/C++时间字符串与time_t之间的转换方法(转)

来源:小侦探旅游网
1.指定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);
}
2.指定YYYYMMDDHH24MISS型的时间,格式化为time_t型的时间
time_t FormatTime2(char * szTime)
{
       struct tm tm1;
       time_t time1;
       sscanf(szTime, "M-----",   
                 &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);// 注意,如果要printf打印tm的内容,应当放在mktime调用 之前,调用之后它的内容可能会变化
       return time1;
}
3.localtime函数内部使用的是static变量存储的结果,也就是说首先它不是线程安全的,再者不能同时用它转换两个时间,即假如有
time_t startTime, time_t stopTime
struct tm *starttm, *stoptm;
    starttm = localtime(&startTime);
    stoptm = localtime(&stopTime);

这样最终实际上starttm和stoptm指向的是同一个值,也就是说它俩的值都是后面这个调用即stopTime转换过来的值。

正确的用法是使用localtime_r,它是线程安全的:

localtime_r(&startTime, &starttm);
localtime_r(&stopTime, &stoptm);

因篇幅问题不能全部显示,请点此查看更多更全内容