使用C ++的两个日期的差异

时间:2014-07-28 05:48:41

标签: c++ c linux

我试图通过首先读取保存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);
}

1 个答案:

答案 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并且确实如此   不要改变破碎时间结构的成员。

因此,如果您打印出epochepoch2,我可以打赌这两个时间戳都会获得-1