在下面的代码中,我尝试获取当地时间和格林威治时间,并找出它们之间的区别。但输出结果显示时间值相等:
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);
}
我有一个错误,但我找不到它...... 请有人告诉我我的错...?
答案 0 :(得分:1)
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));
答案 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版本会更好,因为我的程序将在嵌入式设备(几个平台)上工作,我不知道工具链是否支持可重入函数够了。
再次感谢。