在下面的代码中,我尝试获取本地时间和格林威治时间,并找出它们之间的差异。但输出显示两个时间值相等:

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);
}

我有一个错误,但我找不到。。。
有人能告诉我我的错吗。。?

最佳答案

gmtimelocaltime函数都返回指向固定缓冲区的指针。在您的实现中,它们似乎使用相同的缓冲区,因此对gmtime的调用将填充该缓冲区,然后对localtime的调用将用不同的数据填充该缓冲区。
如果您有gmtime_rlocaltime_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));

09-28 02:43