2009-07-16 120 views
1

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

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

另一个例子是,如果d1 = 12/1/2007和d2 = 6/30/2012那么d1和d2之间的总天数将是1674年,并且闰年中的天数将是548

我已经有函数来计算特定年份是闰年,还有函数来计算两个日期之间的天数。

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

+0

>如果某一年是闰年,并且具有计算两个日期之间的天数的函数,则我已具有计算函数的功能。
我只能说,我当然希望你正在使用一个良好的固体库,因为你应该为解决整个问题,以及.. – Tim 2009-07-16 23:38:05

+0

“我已经有函数calcualte如果一个特定的一年是一个闰年和以及计算两个日期之间的天数的函数。“ - 听起来像是我最喜欢的方式。 – 2009-07-17 00:00:01

回答

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); 
     } 

    } 
} 
0

幼稚的做法是:

检查你的开始年份。如果是闰年,请计算当天到12月31日(含)之间的天数。如果不是,直到你的开始年份等于你的结束年份,将年份增加1.然后,检查年份。如果是闰年,则开始计算天数,如果不增加年份。一旦当前年份和结束年份相同,然后检查当前(==结束)年份是否为闰年。如果是这样,请计算从一月到最后一个月的几个月内的天数,否则请打破该算法。一旦你的当前月份是你的结束月份,请计算你的日子。

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 
相关问题