获得当地和格林威治时间

时间:2010-08-01 14:08:52

标签: c time

在下面的代码中,我尝试获取当地时间和格林威治时间,并找出它们之间的区别。但输出结果显示时间值相等:

diff=0 iTm1=16:34 iTm2=16:34 <-----[gmtime is 13:34 actualy]

当我刚刚恢复gmtime时,它可以正常工作。但是当我检索本地和gmtime时,gmtime变得等于本地时间。

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

我有一个错误,但我找不到它...... 请有人告诉我我的错...?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

使用指向struct tm的指针而不实际拥有保存内存的变量时出错了。这是一个修复版本:

#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);
    iDiff=(int)((iTm2.tm_hour - iTm1.tm_hour)) * 60;
    printf("diff=%d iTm1=%d:%d iTm2=%d:%d\n", iDiff,
       iTm1.tm_hour, iTm1.tm_min,
       iTm2.tm_hour, iTm2.tm_min);
}

答案 2 :(得分:0)

localtime和gmtime都使用clib中的静态内存进行处理。因此,当您使用一个时,它会覆盖之前的呼叫。

您需要调用gmtime,然后提取所需的变量并将其存储在单独的位置。然后调用localtime,进行比较。

或者,您可以使用这些调用的可重入版本(localtime_r,gmtime_r),您必须提供自己的内存,但不会覆盖任何数据。

我建议习惯使用这些调用的可重入版本,然后像这样的错误不会显示他们丑陋的头脑!

答案 3 :(得分:0)

来自Linux手册页的引用:

gmtime()函数[... snip ...]        返回值指向静态分配的结构,该结构可能被后续调用覆盖        任何日期和时间函数。 gmtime_r()函数执行相同操作,但将数据存储在        用户提供的结构。  

  localtime()函数[... snip ...] 返回值指向静态        已分配的结构,可能会被后续调用任何日期和时间函数覆盖。        localtime_r()函数执行相同操作,但将数据存储在用户提供的结构中。它不需要        设置tzname。

答案 4 :(得分:0)

谢谢大家! 我理解我的问题。我认为如果我不使用时间函数的_r版本会更好,因为我的程序将在嵌入式设备(几个平台)上工作,我不知道工具链是否支持可重入函数够了。

再次感谢。