【问题标题】:Does time.h Allow Leap Years Ctime.h 是否允许闰年 C
【发布时间】: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 tm reference。我建议你阅读它。

标签: c date time


【解决方案1】:

好友只需尝试以下操作(将您的月份分别更改为 1 和 2 而不是 2 和 3,它会给您正确的结果,此更改已经过测试)。

根据 Joachim 和 Floris 的说法, tm_mon 成员的月份从零开始,您计算的是 3 月 1 日和 4 月 1 日之间的差异,而不是 2 月 1 日和 3 月 1 日之间的差异。

  start_date.tm_hour = 0;  start_date.tm_min = 0;  start_date.tm_sec = 0;
  start_date.tm_mon = 1; 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 = 2; end_date.tm_mday = 1; end_date.tm_year = 112;

【讨论】:

  • 您正在识别正确的问题。可能值得解释几行 - 即“月份从零开始,您计算的是 3 月 1 日和 4 月 1 日之间的差异,而不是 2 月 1 日和 3 月 1 日之间的差异”等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2022-11-14
  • 2022-10-02
  • 2013-04-27
相关资源
最近更新 更多