问题:求解year1-month1-day1 和 year2-month2-day2的日期差
思路:将两个date间的间隔天数计算转换为计算两个日期到同一基准日期的天数差
说明(如图所示):
- 求解dist1, _dist2(year-month-day是year那一年的第多少天)
- 求解sum(year1一整年的天数 + 中间所有年的天数(365or366)until year2的前一年)
- 计算dist2(dist2 = sum + _dist2)
- 计算待求解的日期差(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对应的日期在后者之前;无日期合法性检查