【问题标题】:difference seen in difftime and strftime valuesdifftime 和 strftime 值的差异
【发布时间】:2013-01-15 20:08:36
【问题描述】:

我看到时间函数有所不同,想知道原因是什么。 目前,我使用的是 localtime、mktime、strftime 和 difftime:

time_t ltime; 
ltime = time(NULL); 
StartTM = localtime(&ltime); 
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++ 中)最好以微/毫秒为单位,可以跟踪一天中的时间并从另一个中减去一个?

谢谢。

【问题讨论】:

    标签: c++ time mktime


    【解决方案1】:

    ltimetime1 中的值应该相同;通过localtime()mktime() 的往返应该会给你你开始的答案。同样,当然,对于ttimetime2

    此 C 代码演示了预期的行为。您需要仔细查看代码以找出问题所在。

    #include <stdio.h>
    #include <time.h>
    #include <unistd.h>
    
    int main(void)
    {
    
        time_t     ltime = time(NULL); 
        struct tm *start = localtime(&ltime); 
        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 行重复代码块是值得的;当然,您需要它返回time1time2,这样您就可以在“主”代码中进行区分。还要记住localtime() 可能会返回相同的指针两次;在您使用结束时间调用 localtime() 之后,您无法可靠地使用开始时间结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多