Расчет количества дней между двумя датами високосного года - PullRequest
2 голосов
/ 17 июля 2009

Учитывая две даты, каков наилучший метод для расчета количества дней между этими двумя датами, приходящимися на високосный год.

Например, если d1 = 12/1/2007 и d2 = 1/31/2008, то общее количество дней между d1 и d2 будет 62, а количество дней, выпадающих в високосный год, будет 31.

Другой пример: если d1 = 12/1/2007 и d2 = 30/30/2012, то общее число дней между d1 и d2 будет 1674, а количество дней, выпадающих в високосный год, будет 548.

У меня уже есть функция для расчета, является ли конкретный год високосным, и функция для вычисления количества дней между двумя датами.

Если у кого-нибудь есть такой алгоритм в Delphi (Pascal) или C / C ++ / C #, это будет очень цениться. Любые предложения и помощь будут великолепны.

Ответы [ 3 ]

1 голос
/ 16 мая 2013

Решение написано на 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
0 голосов
/ 17 июля 2009

Вот моя версия псевдокода, использующая ваши функции для - 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 голосов
/ 17 июля 2009

Наивный подход будет:

Проверьте ваш начальный год. Если это високосный год, подсчитайте количество дней с вашего текущего дня до 31 декабря (включительно). Если нет, пока начальный год не станет равным конечному году, увеличьте год на 1. Затем проверьте год. Если это високосный год, начните считать дни, если не увеличивать год. Если текущий год и год окончания совпадают, проверьте, является ли текущий (== конечный) год високосным. Если это так, считайте дни в месяцах с января по последний месяц, иначе нарушите алгоритм. Как только ваш текущий месяц станет вашим последним месяцем, сосчитайте ваши дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...