【发布时间】:2014-06-25 10:09:59
【问题描述】:
我正在寻找一种方法来找出两个日期之间的差异。解决方案需要考虑闰年。请参阅下面的两个代码块。 2012 年是闰年,而 2013 年不是,所以我不明白为什么两个程序都输出“32 天差异”。如果 time.h 确实考虑了闰年,它们肯定应该不同吗?
第一个:
#include <stdio.h>
#include <time.h>
int main ()
{
struct tm start_date;
struct tm end_date;
time_t start_time, end_time;
double days;
start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0;
start_date.tm_mon = 2; start_date.tm_mday = 1; start_date.tm_year = 112;
end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0;
end_date.tm_mon = 3; end_date.tm_mday = 1; end_date.tm_year = 112;
start_time = mktime(&start_date);
end_time = mktime(&end_date);
days = difftime(end_time, start_time) / 86400;
printf ("%.f days difference\n", days);
return 0;
}
第二个:
#include <stdio.h>
#include <time.h>
int main ()
{
struct tm start_date;
struct tm end_date;
time_t start_time, end_time;
double days;
start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0;
start_date.tm_mon = 2; start_date.tm_mday = 1; start_date.tm_year = 113;
end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0;
end_date.tm_mon = 3; end_date.tm_mday = 1; end_date.tm_year = 113;
start_time = mktime(&start_date);
end_time = mktime(&end_date);
days = difftime(end_time, start_time) / 86400;
printf ("%.f days difference\n", days);
return 0;
}
【问题讨论】:
-
小心,因为您将结构声明为局部变量,但不会初始化其中的所有字段。这意味着未初始化字段的值将是不确定的,
mktime调用的结果将是未定义的。 -
另请注意,您输入的月份是三月和四月。
tm_mon成员字段从零开始,其中一个是二月,二是三月。参见例如this reference. -
@JoachimPileborg 非常感谢,我认为那是错误的,现在可以了。但是,我不太明白您的第一条评论,您能扩展一下吗?
-
局部变量(即在函数内部声明的变量)没有被编译器初始化。当它们已定义但未初始化时,它们的值是不确定的,并且在没有初始化的情况下使用它们(即分配给它们)会导致undefined behavior。当然,这适用于数组和结构变量以及简单的整数或浮点变量。要初始化结构变量,请执行例如
struct tm start_date = { 0 };,或确保初始化结构中的 所有 成员。 -
@Floris 我之前链接到a
struct tmreference。我建议你阅读它。