首页 > 解决方案 > gettimeofday 计算日期变化的时间

问题描述

我在尝试测量经过时间时看到的典型示例如下所示:

#include <sys/time.h>
#include <stdio.h>
 
int main() {
 
  struct timeval start, end;
  gettimeofday(&start, NULL);
 
  //Do some operation
  gettimeofday(&end, NULL);

  unsigned long long end_time = (end.tv_sec * 1000000 + end.tv_usec);
  unsigned long long start_time = (start.tv_sec * 1000000 + start.tv_usec);

  printf("Time taken : %ld micro seconds\n", end_time - start_time);

  return 0;
}

这在中午的某个地方很棒,但是如果有人要在深夜运行一些测试,这将不起作用。我的方法是这样来解决它的:

#include <sys/time.h>
#include <stdio.h>
 
int main() {
 
  struct timeval start, end;
  gettimeofday(&start, NULL);
 
  //Do some operation

  gettimeofday(&end, NULL);

  unsigned long long end_time = (end.tv_sec * 1000000 + end.tv_usec);
  unsigned long long start_time = (start.tv_sec * 1000000 + start.tv_usec);
  unsigned long long elapsed_time = 0;

  if ( end_time < start_time )
     //Made up some constant that defines 86,400,000,000 microseconds in a day
     elapsed_time = end_time + (NUM_OF_USEC_IN_A_DAY - start_time); 
  else
     elapsed_time = end_time - start_time;

  printf("Time taken : %ld micro seconds\n", elapsed_time);

  return 0;
}

有没有更好的方法来预测一天的变化gettimeofday

标签: ctime

解决方案


尽管有名称,但gettimeofday结果不会每天滚动。gettimeofday秒计数,就像秒计数一样,从time1970 年的第一天(特别是 1970 年 1 月 1 日 00:00:00 +00:00)从零开始,此后一直稳步增加。在 32 位系统上time_t,它将在 2038 年的某个时间翻转;由于这个确切的原因,人们现在正在努力逐步淘汰 32 位的使用,time_t我们预计将在 2038 年之前完成。

gettimeofday结果也与时区无关,不受夏令时变化的影响。当计算机的时钟重置时,它们可以后退。如果你不想担心这个,你可以使用clock_gettime(CLOCK_MONOTONIC)jnstead。


推荐阅读