计算两个日期相差多少天

/*** 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天* * 比如 2000/04/05-2002/05/
/*** 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天* * 比如 2000/04/05-2002/05/02* * |----------+---/--------------------------------------|----------+---/* 2000       4  5                                      2002       5  2* * [----------------for 循环年得到的天数------------------]* [-减去走过的天数-]                                     [-加上走过的天数-]*                 [----------------------最终天数-----------------------] *           */#include static inline int is_leap_year(unsigned int year)
{return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}typedef struct
{int year;int month;int day;
} rtc_date_t;const static int month_days[2][13] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31}, /* 润年月 */{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31}, /* 平年月 */
};/* 计算两个日期相差多少天 */
int dday(rtc_date_t date1, rtc_date_t date2)
{rtc_date_t *dmax = date1.year > date2.year ? &date1 : &date2;rtc_date_t *dmin = date1.year > date2.year ? &date2 : &date1;int days = 0;for (int y = dmin->year; y < dmax->year; y++)days += is_leap_year(y) ? 366 : 365;/* 减去较小的日期走过多少天 */int leap = is_leap_year(dmin->year);for (int m = 1; m < dmin->month; m++)days -= month_days[leap][m - 1];/* 加上较大的日期走过多少天 */leap = is_leap_year(dmax->year);for (int m = 1; m < dmax->month; m++)days += month_days[leap][m - 1];days += dmax->day - dmin->day;return days < 0 ? -days : days;
}/* 测试 */
int main(int argc, char const *argv[])
{rtc_date_t d1;rtc_date_t d2;scanf("%d %d %d %d %d %d", &d1.year, &d1.month, &d1.day, &d2.year, &d2.month, &d2.day);int days = dday(d1, d2);printf("%04d/%02d/%02d - %04d/%02d/%02d --> %d days\n", d1.year, d1.month, d1.day, d2.year, d2.month, d2.day, days);return 0;
}