Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中两个日期之间的差异_C_Linux_Time.h - Fatal编程技术网

C中两个日期之间的差异

C中两个日期之间的差异,c,linux,time.h,C,Linux,Time.h,我试图通过使用下面的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_

我试图通过使用下面的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 difference\n", seconds);

  return 0;
}

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

问题是tm_年是自1900年以来的一年,因此2013年将是113年


鉴于2013年,mktime将返回-1,因为无法表示日历时间。您可能认为3913年是一个有效的日历时间,原因与Joni指出的原因有关。除了没有正确指定年份之外,您还未设置
tm_isdst
字段
mktime
使用此字段确定日期是否具有有效的夏令时,或者是否应从时区数据库中查找DST设置。这可以使结果缩短一个小时。添加以下行:

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

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

正如@Joni提到的,设置
tm_isdst
字段。如果您知道DST是如何应用的,请使用
0
1
,否则请使用“-1”并让操作系统进行确定

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


我断言根本问题是使用
mktime()
,如果它是
(time)-1
,则不进行检查。对于健壮的代码,应该测试此返回值,并忽略打开的操作代码,以获得意外的结果。

我会将这些结构置零,只是确保字段都为零。也许不是你的问题。当我在macbook上运行它时,我得到了“428400秒的差异”。gcc和叮当声。当我把这些结构归零时,我得到了432000秒的差异。在valgrind下运行原始代码,您会收到一系列关于在
mktime
中使用未初始化值的警告。你一定要把结构归零。见下面chux的答案。这是你看到的0差异的唯一解释。您需要检查mktime()的返回值是否有错误。正如其他人所建议的,在使用它之前,最好将结构memset为0/初始化它。。。如果
time\u t
是32位值,则可以表示的最后一个日期为。请帮助我理解问题的新编辑。因为您计算的是同一年中两个日期之间的差值(闰年除外,范围包括2月)。只要你的tm_年在0到138之间,你的结果应该是一样的。我希望我正确理解你的问题
  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;
/* lookup if DST or not */
start_date.tm_isdst = -1;
end_date.tm_isdst = -1;