/*** 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天* * 比如 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;
}
计算两个日期相差多少天
/*** 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天* * 比如 2000/04/05-2002/05/
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!