在下面的代码中,我尝试获取本地时间和格林威治时间,并找出它们之间的差异。但输出显示两个时间值相等:
diff=0 iTm1=16:34 iTm2=16:34 <-----[gmtime is 13:34 actualy]
当我刚刚检索gmtime时,它工作正常。但是当我同时检索local和gmtime时,gmtime就等于localtime。
#include <stdio.h>
#include <time.h>
int main()
{
time_t iTime;
struct tm * iTm1;
struct tm * iTm2;
int iTimeDifferenceInMinutes;
time(&iTime);
iTm1=gmtime(&iTime);
iTm2=localtime(&iTime);
iTimeDifferenceInMinutes=(int)((iTm2->tm_hour - iTm1->tm_hour)) * 60;
printf("diff=%d iTm1=%d:%d iTm2=%d:%d\n", iTimeDifferenceInMinutes,
iTm1->tm_hour, iTm1->tm_min,
iTm2->tm_hour, iTm2->tm_min);
}
我有一个错误,但我找不到。。。
有人能告诉我我的错吗。。?
最佳答案
gmtime
和localtime
函数都返回指向固定缓冲区的指针。在您的实现中,它们似乎使用相同的缓冲区,因此对gmtime
的调用将填充该缓冲区,然后对localtime
的调用将用不同的数据填充该缓冲区。
如果您有gmtime_r
和localtime_r
,请使用它们。(您可能需要在#define _POSIX_SOURCE
之前包含行#include <time.h>
或类似的内容)您需要为两个struct tm
对象分配内存。
struct tm local_tm, gm_tm;
time(&iTime);
gmtime_r(&iTime, &gm_tm);
localtime_r(&iTime, &local_tm);
旧系统没有
_r
版本(添加它们是因为在多线程程序中不容易使用普通版本)。然后在下一次调用这两个函数之前必须复制数据。struct tm local_tm, gm_tm;
time(&iTime);
memcpy(&gm_tm, gmtime(&iTime), sizeof(gm_tm));
memcpy(&local_tm, localtime(&iTime), sizeof(local_tm));