为什么_localtime32和_gmtime32为非GMT时区返回相同的时间值?

时间:2012-03-16 14:04:57

标签: c++ windows windows-server-2008-r2

我的时区在控制面板日期/时间小程序中设置为CDT

以下代码将完全相同的日期和时间放入pCurGmtTimepCurTime

int main(int argc, char *argv[])
{
  __time32_t t=_time32(NULL);

  tm *pCurGmtTime=_gmtime32(&t);
  tm *pCurTime=_localtime32(&t);

  // The values in the *pCurGmtTime structure are equal to the values in *pCurTime

  return 0;
}

我没有设置TZ环境变量,但是通过“控制面板日期和时间”小程序为系统正确配置了我的时区。这种行为似乎与这些函数的MSDN文档相悖,后者表示TZ会覆盖控制面板设置,但如果不存在,则将使用控制面板设置。

由于

2 个答案:

答案 0 :(得分:5)

因为这两个调用返回的指针都指向相同的内部结构:

http://msdn.microsoft.com/en-us/library/bf12f0hc(v=vs.80).aspx

  

32位和64位版本的gmtime,mktime,mkgmtime和localtime都为每个线程使用单个tm结构进行转换。每次调用其中一个例程都会破坏前一个调用的结果。

您的第二个电话(_localtime32())会覆盖第一个电话的值。如果您要比较指针值本身,您会发现它们是相同的。

如果您使用文档顶部所述的_s版本,那么您就不会遇到这个问题,因为您必须传递自己的struct *tm

答案 1 :(得分:3)

由于

  

32位和64位版本的gmtime,mktime,mkgmtime和localtime都为每个线程使用单个tm结构进行转换。

第二次调用将数据写入与前一次相同的位置。在调用localtime之前,您需要将数据复制到其他位置。