【问题标题】:difftime returns incorrect value in MinGWdifftime 在 MinGW 中返回不正确的值
【发布时间】:2014-01-27 16:51:24
【问题描述】:

我正在尝试计算两个 time_t 之间的差异。
但是difftime 返回它的第一个参数而不是差值!
我的代码是:

 #include <windows.h>
 #include <stdio.h>
 #include <time.h>
 #include <unistd.h>

 int main(){
     time_t etime_t,now_t;
     double time_diff;
     now_t=1388525484L;
     etime_t=1389338644L;
     time_diff=difftime(now_t,etime_t);
     printf("%f",time_diff);
 }

它会打印:

1388525484.000000

我正在使用GCC(在MinWG)进行编译
有什么问题?

【问题讨论】:

  • 很明显它是#define difftime(t1,t0) (double)(t1 - t0) 。你可以尝试一次在 printf() 中直接打印“double(t1-t0)”
  • difftime(etime_t,now_t); ? (您对类型 time_t 的实现做出假设是不好的。)
  • @kripanand:减法没问题!只有difftime 失败!
  • @BLUEPIXY:什么?!有什么不同?我希望切换参数会产生负面结果!看来difftime 不合逻辑! (?) 使用 now_t - etime_t 而不是 difftime 废话解决了我的问题 - 但我认为不是 difftime ;-) - 谢谢
  • time_t :它们是能够表示时间的算术类型。 clock_t 和 time_t 中可表示的时间范围和精度是实现定义的

标签: c windows time mingw time.h


【解决方案1】:

MinGw 错误。他们将 difftime 编译为标准 windows 函数的调用。但是,即使参数是 64 位,它们也会调用 32 位版本的 difftime。这给出了预期的结果,因为它从下半部分减去了第一个参数的上半部分(即 0)。看 bug report 在这里。可以通过插入来临时固定

#define _USE_32BIT_TIME_T 1

在包含 time.h 之前

【讨论】:

  • “这给出了预期的结果,因为它从它的下半部分减去了第一个参数的上半部分(即 0)。”,为什么,作为第一个参数是结束时间,第二个是开始时间(因此参数编组如何准确工作)?在time.h 之前添加#define _USE_32BIT_TIME_T 1 并不总能解决问题。根据个人经验,我得出的结论是它必须包含在stdio.h 之前。请您详细说明您的答案吗?
【解决方案2】:
/*my little lab:*/
#include <sys/types.h>
#include <stdio.h
#include <time.h>
#include <unistd.h>
int main(void)
{
 time_t etime_t, now_t;
 struct tm timev_n; 
 struct tm timev_e; 
 struct tm *ptimev_n = &timev_n; 
 struct tm *ptimev_e = &timev_e; 

 double time_diff;
 now_t= 1388525484L;
 etime_t=   1389338644L;
 ptimev_n= gmtime_r(&now_t, ptimev_n );
 ptimev_e= gmtime_r(&etime_t, ptimev_e );
 printf (" now:  %s \n", asctime(ptimev_n)); 
 printf (" end:  %s \n", asctime(ptimev_e)); 
 // time_diff=difftime(now_t,etime_t);
 time_diff=difftime(etime_t, now_t);
 printf("%f \n",time_diff);
 etime_t = (time_t)  time_diff;
 ptimev_e= gmtime_r(&etime_t, ptimev_e );
 printf ("back to the 70's diff:  %s \n", asctime(ptimev_e)); 

 return 1;
 }

给出输出:

" 现在:2013 年 12 月 31 日星期二 21:31:24

结束:2014 年 1 月 10 日星期五 07:24:04

813160.000000 回到 70 年代的差异:1970 年 1 月 10 日星期六 09:52:40 " 请检查参数的顺序到 difftime,也许你的系统有 unsigned time_t ?

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 2017-11-04
    • 1970-01-01
    • 2016-10-09
    • 2021-10-26
    • 2015-10-13
    • 2014-12-06
    • 2021-02-01
    • 2017-08-21
    相关资源
    最近更新 更多