【Calendar Function】计算日期差

     问题:求解year1-month1-day1 和 year2-month2-day2的日期差

     思路:将两个date间的间隔天数计算转换为计算两个日期到同一基准日期的天数差

     说明(如图所示):

  1.  求解dist1, _dist2(year-month-day是year那一年的第多少天)
  2.  求解sum(year1一整年的天数 + 中间所有年的天数(365or366)until year2的前一年)
  3.  计算dist2(dist2 = sum + _dist2)
  4.  计算待求解的日期差(dist2-dist1)

                                    

/* calculate :How many days between year1-month1-day1 and year2-month2-day2 */
#include <stdio.h>
int monthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int totalDays[13];
int isLeapYear(int year){
    return year%4==0 && year%100!=0 || year%400==0 ? 1:0;
}
int yearTotalDays(int year){
    return isLeapYear(year)? 366:365;
}
void updateMonthDays(int year){
    if(isLeapYear(year))
        monthDays[2] = 29;
    else
        monthDays[2] = 28;
}
void updateTotalDays(int year){
    updateMonthDays(year);
    int i;
    for(i=1; i<13; i++){
        if(i==1)
            totalDays[i] = monthDays[i];
        else
            totalDays[i] = totalDays[i-1] + monthDays[i];
    }
}
/* year-month-day is ?th day from year-01-01*/
int calDist(int year, int month, int day){
    updateTotalDays(year);
    return month==1? day:totalDays[month-1]+day;
}
//default:year1<year2
long int calDays(int year1, int month1, int day1, int year2, int month2, int day2){
    int dist1 = calDist(year1, month1, day1); //year1-01-01  ~  year1-month1-day1
    int _dist2 = calDist(year2, month2, day2);//year2-01-01  ~  year2-month2-day2
    //sum:yearTotalDays(year1)+...+yearTotalDays(year2-1)
    long int sum = 0;
    int year;
    for(year=year1; year<year2; year++){
        sum += yearTotalDays(year);
    }
    long int dist2 = _dist2 + sum;
    return dist2-dist1;
}

int main(){
    int year1, month1, day1, year2, month2, day2;
    long int dist;
    while(scanf("%d-%d-%d %d-%d-%d",&year1, &month1, &day1, &year2, &month2, &day2) != EOF){
        dist = calDays(year1, month1, day1, year2, month2, day2);
        printf("Day distance: %ld\n", dist);
    }
    return 0;
}

                                           

注:输入默认year1对应的日期在后者之前;无日期合法性检查

猜你喜欢

转载自blog.csdn.net/lqy0927/article/details/81459869
今日推荐