【问题标题】:why gmtime and localtime give me the same result?为什么 gmtime 和 localtime 给我相同的结果?
【发布时间】:2013-05-02 18:03:44
【问题描述】:

我有以下测试代码来查看 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;

编辑:

我在东部时区。

EDIT2:

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

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

【问题讨论】:

  • 你在什么系统上?
  • linux机器,fedora

标签: c++ c


【解决方案1】:

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

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

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

【讨论】:

  • tm gmtimestruct; memcpy (&amp;gmtimestruct, gmtime(&amp;now), sizeof gmtimestruct); 将按预期运行。
  • @5YrsLaterDBA 您仍然没有复制调用结果。您只是将相同的指针存储在两个不同的位置。例如tm timeStruct = *gmtime(&amp;now);
  • @MarkB:是的,我想你会发现pTimeStruct == plocalTimeStruct
  • 谢谢你们。是的,我必须复印一份。
【解决方案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);

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,用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);
    

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 2014-10-26
      • 2014-08-14
      • 1970-01-01
      • 2012-11-15
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多