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

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

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

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

UNIX纪元时间是自1970年1月1日00:00:00.0以来的日期的总秒数

一旦获得秒数,就可以将该差异除以一天中的秒数(即24小时* 60分钟* 60秒= 86400秒 )。

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

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

有关一组此类代码的想法,请参阅“ 日历计算 ”。

谷歌是你的朋友: http : //alcor.concordia.ca/~gpkatch/gdate-algorithm.html

来自维基百科的闰年算法 :

伪码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 
 #include  #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; } 

您根本不需要嵌套条件。

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