5

我有以下测试代码来查看 gmtime 和 localtime 之间的区别。但他们给了我同样的结果:UTC:2013-05-02T13:59:58 Local: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;

编辑:

我在东部时区。

编辑2:

更新的代码使用 diff 结构,但得到了相同的结果:

        time_t now;
        time(&now);
        time_t now2;
        time(&now2);
        tm *pTimeStruct = gmtime(&now);
        tm *plocalTimeStruct = localtime(&now2);
4

3 回答 3

11

您需要将调用之间的值复制到gmtimelocaltime

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

我系统上的手册页说。至少在 Linux 上这是常见的行为。

于 2013-05-02T18:08:13.693 回答
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);
于 2013-10-26T16:27:07.633 回答
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);
于 2013-10-06T11:16:34.283 回答