我看到时间功能的差异,并想知道是什么原因。 目前,我正在使用localtime,mktime,strftime和difftime:
time_t ltime;
ltime = time(NULL);
StartTM = localtime(<ime);
time_t time1 = mktime(StartTM );
char startbuffer [128];
strftime( start_buffer, 128, "%H:%M:%S", StartTM );
<<Do some stuff, take some time >>>
time_t ttime;
ttime = time(NULL);
StopTM = localtime(&ttime);
time_t time2 = mktime(StopTM );
char stop_buffer [128];
strftime( stop_buffer, 128, "%H:%M:%S:", StopTM );
double wtinsec = difftime(time2, time1);
执行后,输出如下:
停止缓冲区= 08:46:18
开始缓冲区= 08:44:11
wtinsec = 129
手动减去开始,时间长度为2:07,但总秒数(difftime)为2:09。由于两次计算都使用相同的原始数据(time1,time2),我最初的想法是strftime转换缺乏精确性和difftime是这个原因的组合。
但差异并不是一成不变的。如果2个本地呼叫之间的时间很短(例如10秒),则没有区别。但是,随着2次呼叫之间的时间变长,时间总数的差异变大。 2分钟,2分钟,5分钟,4秒,等等......
出现这种情况的任何原因,是否有更准确的(在C ++中),最好是微/毫秒,可以跟踪一天中的时间并从另一个中减去一个?
感谢。
答案 0 :(得分:1)
ltime
和time1
中的值应相同;通过localtime()
和mktime()
的往返行程应该可以为您提供答案。同样,当然,对于ttime
和time2
。
此C代码演示了预期的行为。您需要仔细查看代码以找出问题所在。
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main(void)
{
time_t ltime = time(NULL);
struct tm *start = localtime(<ime);
time_t time1 = mktime(start);
char startbuffer[128];
strftime(startbuffer, sizeof(startbuffer), "%H:%M:%S", start);
printf("lt = %10lu, t1 = %10lu, time = %s\n",
(unsigned long)ltime, (unsigned long)time1, startbuffer);
sleep(10);
time_t ttime = time(NULL);
struct tm *finis = localtime(&ttime);
time_t time2 = mktime(finis);
strftime(startbuffer, sizeof(startbuffer), "%H:%M:%S", finis);
printf("lt = %10lu, t1 = %10lu, time = %s\n",
(unsigned long)ttime, (unsigned long)time2, startbuffer);
printf("diff time = %.2f\n", difftime(time2, time1));
return(0);
}
示例输出(来自Mac OS X 10.7.5):
lt = 1358284665, t1 = 1358284665, time = 13:17:45
lt = 1358284675, t1 = 1358284675, time = 13:17:55
diff time = 10.00
我建议查看代码中的值,类似于我的方式。您可能(或可能不)打印出struct tm
结构的内容。值得做一个函数来处理重复代码的7行块;当然,你需要它来返回time1
和time2
,这样你才能在“主要”代码中做出改变。还要记住localtime()
可能会返回两次相同的指针;在使用完成时间调用localtime()
后,您无法可靠地使用开始时间结构。