我有以下测试代码,以了解gmtime和localtime之间的区别。但是他们给了我相同的结果: UTC:2013-05-02T13:59:58当地时间:2013-05-02T13:59:58
time_t now;
time(&now);
tm *pTimeStruct = gmtime(&now);
tm *plocalTimeStruct = localtime(&now);
string timeStr = "";
char timeBuf[64] = {'\0'};
sprintf(timeBuf,"UTC:%-4.4d-%-2.2d-%-2.2dT%-2.2d:%-2.2d:%-2.2d "
"Local:%-4.4d-%-2.2d-%-2.2dT%-2.2d:%-2.2d:%-2.2d",
(pTimeStruct->tm_year + 1900),
(pTimeStruct->tm_mon + 1),
pTimeStruct->tm_mday,
pTimeStruct->tm_hour,
pTimeStruct->tm_min,
pTimeStruct->tm_sec,
(plocalTimeStruct->tm_year + 1900),
(plocalTimeStruct->tm_mon + 1),
plocalTimeStruct->tm_mday,
plocalTimeStruct->tm_hour,
plocalTimeStruct->tm_min,
plocalTimeStruct->tm_sec);
timeStr += timeBuf;
cout << timeStr << endl;
编辑:
我在东部时区。
EDIT2:
更新的代码使用diff struct,但结果相同:
time_t now;
time(&now);
time_t now2;
time(&now2);
tm *pTimeStruct = gmtime(&now);
tm *plocalTimeStruct = localtime(&now2);
答案 0 :(得分:7)
您需要在调用gmtime
和localtime
之间复制值:
返回值指向静态分配的结构,可能会被后续调用任何日期和时间函数覆盖。
说我的系统上的手册页。这至少在Linux上是常见的行为。
答案 1 :(得分:2)
您还可以使用gmtime_r和localtime_r,它们是线程安全的,并将数据存储在用户提供的结构中。
struct tm *gmtime_r(const time_t *timep, struct tm *result);
struct tm *localtime_r(const time_t *timep, struct tm *result);
对于Windows用户,请注意:_gmtime_s和_localtime_s是Microsoft版本。
errno_t _gmtime_s(struct tm* _tm, const __time_t* time);
errno_t _localtime_s(struct tm* _tm, const time_t *time);
答案 2 :(得分:0)
我也遇到了这个问题,并使用memcpy解决了这个问题:
time_t t = time(NULL);
tm* gmt = (tm*)malloc(sizeof(tm));
memcpy(gmt, gmtime(&t), sizeof(tm));
tm* loc = localtime(&t);
cout << asctime(gmt) << endl;
cout << asctime(loc) << endl;
free(gmt);