上程序:
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main( int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S" ,ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S" ,ptmEnd); printf("%s /n" ,szTmp); printf("%s /n" ,szEnd); system("PAUSE" ); return EXIT_SUCCESS; }
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main( int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S" ,ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S" ,ptmEnd); printf("%s /n" ,szTmp); printf("%s /n" ,szEnd); system("PAUSE" ); return EXIT_SUCCESS; }
最后出来的结果是:
21:18:39
21:18:39
和最初想法不一致。
查阅localtime的文档,发现这段话:
This structure is statically allocated and shared by the functions gmtime and localtime . Each time either one of these functions is called the content of this structure is overwritten.
也就是说每次只能同时使用localtime()函数一次,要不就会被重写!
The localtime() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.
因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();
Unlike localtime(), the reentrant version is not required to set tzname。
修改程序:
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main( int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm ptm = { 0 }; struct tm ptmEnd = { 0 }; localtime_r(&tNow, &ptm); localtime_r(&tEnd, &ptmEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S" ,&ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S" ,&ptmEnd); printf("%s /n" ,szTmp); printf("%s /n" ,szEnd); system("PAUSE" ); return EXIT_SUCCESS; }
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main( int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm ptm = { 0 }; struct tm ptmEnd = { 0 }; localtime_r(&tNow, &ptm); localtime_r(&tEnd, &ptmEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S" ,&ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S" ,&ptmEnd); printf("%s /n" ,szTmp); printf("%s /n" ,szEnd); system("PAUSE" ); return EXIT_SUCCESS; }
最后出来的结果是:
10:29:06 10:59:06
另外:
跨平台的线程安全的localtime和gmtime
localtime()返回一个内部静态变量指针,是线程不安全的。 localtime_r()是线程安全的版本,可是Windows上没有。
boost::date_time::c_time为localtime和gmtime这些ctime函数提供了一个统一的版本.
定义为c_time中的2个静态成员函数。
头文件:c_time.hpp
命名空间:boost::date_time
struct c_time {
static tm* localtime(const time_t* t, tm* result);
static tm* gmtime(const time_t* t, tm* result);
}