【问题标题】:Calculating number of days between two dates that are in a leap year计算闰年两个日期之间的天数
【发布时间】:2009-07-16 23:32:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • >如果特定年份是闰年,我已经具有计算功能,以及计算两个日期之间的天数的功能。
    我只能说我当然希望你为此使用一个好的可靠库,因为你也应该解决整个问题..
  • “我已经有了计算特定年份是否是闰年的功能,以及计算两个日期之间的天数的功能。” -- 对我来说听起来好像你已经完成了大部分任务。
  • 是的,我正在使用一个好的实体库来确定特定年份是否为闰年并计算两个特定日期之间的天数。

标签: algorithm leap-year


【解决方案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

【讨论】:

  • 这工作正常。结果与 WolframAlpha 中的结果相同。
【解决方案2】:

这是我使用你的函数的伪代码版本 - 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);
      }

     }
}

【讨论】:

    【解决方案3】:

    一种天真的方法是:

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

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多