C 中两个日期之间的差异



我试图使用以下 C 代码来获取两个日期之间的差异。

但代码总是给出差异 0。帮助我找出我犯错的地方。

我在 Linux 下使用 gcc 编译器。

#include <stdio.h>  
#include <time.h>       
int main ()
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;
  double seconds;
  start_date.tm_hour = 0;  start_date.tm_min = 0;  start_date.tm_sec = 0;
  start_date.tm_mon = 10; start_date.tm_mday = 15; start_date.tm_year = 2013;
  end_date.tm_hour = 0;  end_date.tm_min = 0;  end_date.tm_sec = 0;
  end_date.tm_mon = 10; end_date.tm_mday = 20; end_date.tm_year = 2013;
  start_time = mktime(&start_date);
  end_time = mktime(&end_date);
  seconds = difftime(end_time, start_time);
  printf ("%.f seconds differencen", seconds);
  return 0;
}

编辑:@qchen答案对解决我的问题有很大帮助。还有一个疑问。以下是我的更新。从答案

  start_date.tm_hour = 0;  start_date.tm_min = 0;  start_date.tm_sec = 0;
  start_date.tm_mon = 10-1; start_date.tm_mday = 18; start_date.tm_year = 2013-1876;
  end_date.tm_hour = 0;  end_date.tm_min = 0;  end_date.tm_sec = 0;
  end_date.tm_mon = 10-1; end_date.tm_mday = 20; end_date.tm_year = 2013-1876;

tm_year 是自 1900 年以来的一年,那么如果我将 1876 替换为 1876 年至 2012 年之间的年份,为什么我会得到正确的输出。

问题是tm_year是自 1900 年以来的一年,所以 2013 年将是 113http://en.cppreference.com/w/cpp/chrono/c/tm

  start_date.tm_hour = 0;  start_date.tm_min = 0;  start_date.tm_sec = 0;
  start_date.tm_mon = 10; start_date.tm_mday = 15; start_date.tm_year = 113;
  end_date.tm_hour = 0;  end_date.tm_min = 0;  end_date.tm_sec = 0;
  end_date.tm_mon = 10; end_date.tm_mday = 20; end_date.tm_year = 113;

给定 2013 年,mktime 将返回 -1,因为无法表示日历时间。你会认为 3913 年是一个有效的日历时间,原因与 2038 年问题有关,正如 Joni 所指出

OP 没有检查 mktime()' 结果。

如@Joni所述,设置tm_isdst字段。 如果您知道 DST 是如何应用的,请使用 01,否则使用"-1"并让操作系统做出决定。

@qchen提到了 1900 年的偏移量,因为您可能想要.tm_year = 2013-1900.

我断言根本问题是使用mktime()而不进行(time_t) -1。 对于健壮的代码,应测试此返回值,并缺少打开的 OP 代码以获得意外结果。

除了未正确指定年份外,您还将未设置tm_isdst字段。 mktime使用此字段来确定日期是否具有有效的夏令时,或者是否应从时区数据库中查找 DST 设置。这可能会使结果偏离一小时。添加以下行:

/* lookup if DST or not */
start_date.tm_isdst = -1;
end_date.tm_isdst = -1;

最新更新