C中两个日期之间的差异
我试图通过使用下面的C代码来获得两个日期之间的差异 但代码总是给出差0。帮我找到我犯错误的地方 我正在linux下使用gcc编译器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_
#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;