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

Why is it that _localtime32 and _gmtime32 return the same time value for a non-GMT time zone?

本文关键字:时间 返回 GMT localtime32 gmtime32 为非 为什么 时区      更新时间:2023-10-16

我的时区在控制面板日期/时间小程序中设置为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会覆盖控制面板设置,但如果不存在,则将使用控制面板设置。

谢谢

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

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

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

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

如果您使用文档顶部所述的_s版本,则不会遇到该问题,因为您必须通过自己的struct *tm

因为

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

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