2

给定两个日期,计算闰年这两个日期之间的天数的最佳方法是什么。

例如,如果 d1 = 2007 年 1 月 1 日和 d2 = 2008 年 1 月 31 日,则 d1 和 d2 之间的总天数将为 62 天,闰年的天数将为 31。

另一个示例是,如果 d1 = 12/1/2007 和 d2 = 6/30/2012,则 d1 和 d2 之间的总天数将为 1674 天,闰年的天数将为 548。

我已经有了计算特定年份是否是闰年的函数和计算两个日期之间的天数的函数。

如果有人在 Delphi (Pascal) 或 C/C++/C# 中有这样的算法,将不胜感激。任何建议和帮助都会很棒。

4

3 回答 3

1

解决方案在 python 中,转换为任何其他语言应该不难。

def isLeapYear(year):
    if year%4 == 0:
        if year%100 == 0:
            if year%400 == 0:
                return True
            else:
                return False
        else:
            return True
    else:
        return False

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    cumDays = [0,31,59,90,120,151,181,212,243,273,304,334] #cumulative Days by month
    leapcumDays = [0,31,60,91,121,152,182,213,244,274,305,335] # Cumulative Days by month for leap year
    totdays = 0
    if year1 == year2:
        if isLeapYear(year1):
            return (leapcumDays[month2-1] + day2) - (leapcumDays[month1-1] + day1)
        else:
            return (cumDays[month2-1] + day2) - (cumDays[month1-1] + day1)

    if isLeapYear(year1):
        totdays = totdays + 366 - (leapcumDays[month1-1] + day1)
    else:
        totdays = totdays + 365 - (cumDays[month1-1] + day1)

    year = year1 + 1
    while year < year2:
        if isLeapYear(year):
            totdays = totdays + 366
        else:
            totdays = totdays + 365
        year = year + 1

    if isLeapYear(year2):
        totdays = totdays + (leapcumDays[month2-1] + day2)
    else:
        totdays = totdays + (cumDays[month2-1] + day2)
    return totdays
于 2013-05-16T09:36:14.667 回答
0

一种天真的方法是:

检查您的开始年份。如果是闰年,请计算从当天到 12 月 31 日(含)的天数。如果不是,直到您的起始年份等于您的结束年份,将年份增加 1。然后,检查年份。如果是闰年,开始计算天数,如果不是增加年份。一旦当前年份和结束年份相同,然后检查当前(== 结束)年份是否是闰年。如果是,则计算从一月到结束月份的月份天数,否则会破坏算法。一旦您的当前月份是您的结束月份,请计算您的天数。

于 2009-07-16T23:38:26.180 回答
0

这是我使用你的函数的伪代码版本 - is_leap_year, days_between。正如评论者所指出的,这些是正确编写的棘手函数。

int leap_year_days_between(Date d1, Date d2) {

   if (d1.year == d2.year) {
       if (is_leap_year(d1.year) { return days_between(d1,d2); } 
       else { return 0; }
    }
    else {
      Date last_day_in_year(12, 31, d1.year);
      int count=0;
      Date tmp = d1;
      while (tmp.year < d2.year) {
         if ( is_leap_year(tmp.year) ) {
             count += days_between(tmp,last_day_in_year);
          }
          tmp = (1, 1, tmp.year+1);
      }
      if ( is_leap_year(d2.year) ) {
         count += days_between(tmp, d2);
      }

     }
}
于 2009-07-17T00:05:03.007 回答