我的时区在控制面板日期/时间小程序中设置为CDT
。
以下代码将完全相同的日期和时间放入pCurGmtTime
和pCurTime
:
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
会覆盖控制面板设置,但如果不存在,则将使用控制面板设置。
由于
答案 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
之前,您需要将数据复制到其他位置。