我试图通过首先读取保存tm结构的本地时间并进入睡眠状态5秒并读取另一个本地时间并保存到另一个tm结构来获取两个日期的差异。我希望一旦我把两个日期的差异拿到5或更大的值。但是,我得到了0.
如果注释掉以下几行,我会得到正确的结果:
oldyear.tm_year = oldyear.tm_year + 1900;
oldyear.tm_mon = oldyear.tm_mon + 1;
newyear.tm_year = newyear.tm_year + 1900;
newyear.tm_mon = newyear.tm_mon + 1;
我的代码:
void timeTest()
{
time_t now;
struct tm newyear, oldyear;
double seconds;
time(&now); /* get current time; same as: now = time(NULL) */
oldyear = *localtime(&now);
oldyear.tm_year = oldyear.tm_year + 1900;
oldyear.tm_mon = oldyear.tm_mon + 1;
int epoch1 = mktime(&oldyear);
sleep(5);
time(&now); /* get current time; same as: now = time(NULL) */
newyear = *localtime(&now);
newyear.tm_year = newyear.tm_year + 1900;
newyear.tm_mon = newyear.tm_mon + 1;
int epoch2 = mktime(&newyear);
seconds = difftime(mktime(&newyear),mktime(&oldyear));
printf ("%.f seconds since new year in the current timezone.\n", seconds);
}
答案 0 :(得分:1)
如果我在Linux(64位系统)上编译它,我得到输出
5 seconds since new year in the current timezone.
但是,如果我为32位系统编译,
% gcc -m32 test2.c
% ./a.out
0 seconds since new year in the current timezone.
请注意,mktime
期望年份基于1900且基于月份0,因此您所做的调整不正确,可能会导致32位计算机出现溢出。您的代码所做的是计算日期上2个时间点的差异 3914-08-28 - 在32位系统上,time_t
通常为32位,并且可表示的最大日期为使用03:14:07 UTC on Tuesday, 19 January 2038又名 Y2K38 jf签名time_t
。
错误返回-1:
如果指定的细分时间无法表示为日历 时间(自纪元以来的秒数),
mktime()
返回(time_t) -1
并且确实如此 不要改变破碎时间结构的成员。
因此,如果您打印出epoch
和epoch2
,我可以打赌这两个时间戳都会获得-1
。