为什么gmtime和localtime给我相同的结果?

时间:2013-05-02 18:03:44

标签: c++ c

我有以下测试代码,以了解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);

3 个答案:

答案 0 :(得分:7)

您需要在调用gmtimelocaltime之间复制值:

  

返回值指向静态分配的结构,可能会被后续调用任何日期和时间函数覆盖。

说我的系统上的手册页。这至少在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);