如何计算两个给定日期之间的天数? (闰年障碍)

时间:2009-09-04 22:40:19

标签: c algorithm

  • 任何可被400整除的年份都是闰年(例如,2000年是闰年)。
  • 可被100整除的任何其他年份不是闰年(例如,1700,1800和1900不是闰年)。
  • 可被4整除的任何其他年份是闰年(例如,1996年和2004年是闰年)。

但是我不知道如何在我的c程序中使用能够产生正确答案的状态嵌套...

7 个答案:

答案 0 :(得分:13)

将它们转换为UNIX纪元时间并减去差异。

  

UNIX纪元时间是1970年1月1日00:00:00.0之后的日期总秒数

一旦你得到了秒数,就把这个差异除以一天中的秒数( 24小时* 60分钟* 60秒= 86400秒)。

答案 1 :(得分:2)

我会在Julian day转换两个日期,然后做差异,但我必须检查这是否是一个没有缺点的好解决方案。我建议你也这样做。

答案 2 :(得分:2)

找到一个将日期转换为“自某个时代以来的天数”的库(通常称为朱利安日) - 尽管有天文Julian Date的官方规则,{{3 }})。然后将每个日期转换为相关的数字,并采取差异。假设图书馆处理闰年,你的答案也是如此。

有关一组此类代码的提示,请参阅“Modified Julian Date”。

答案 3 :(得分:1)

答案 4 :(得分:1)

来自维基百科的

Leap year algorithm

伪代码1:

if year modulo 400 is 0 then leap
 else if year modulo 100 is 0 then no_leap
 else if year modulo 4 is 0 then leap
 else no_leap

伪代码2:

function isLeapYear (year):
  if ((year modulo 4 is 0) and (year modulo 100 is not 0)) or (year modulo 400 is 0)
   then true
  else false

答案 5 :(得分:1)

#include <time.h>
#define SECONDS_PER_DAY (24 * 60 * 60)

time_t time_from_date(int year, unsigned month, unsigned day)
{
    return mktime(&(struct tm){
        .tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = day });
}

int days_between(int year0, unsigned month0, unsigned day0,
    int year1, unsigned month1, unsigned day1)
{
    return difftime(time_from_date(year1, month1, day1),
        time_from_date(year0, month0, day0)) / SECONDS_PER_DAY;
}

答案 6 :(得分:0)

您根本不需要嵌套条件。

提示:不要试图确定某一年是否是闰年,而是要确定它之前的闰日总数。

相关问题