比如:开始日期2019/2/28,结束日期2022/8/9
先计算2/28这个日期在2019年里走过了多少天,再计算8/9这个日期在2022年里走过了多少天,判断2019年为平年,一年365天,此时,用365 - 走过的天数 + 8/9在2022年里走过的天数,这两个日期中间还相隔两年,计算这两个年份是否为闰年,2020为闰年则多+1,2021年为平年则不需要多+1。
struct DATE
{
int year;
int mon;
int day;
};
// 判断是否是闰年
#define __isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
int days_passed(struct DATE date) //该年过去了多少天
{
const int days[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
return days[date.mon-1] + date.day + (date.mon > 2 && __isleap(date.year));
}
int diff_day(struct DATE start_da, struct DATE end_da)
{
int sum_day = 0;
int mid_year = 0;
int i = 0;
int days1 = days_passed(start_da);
int days2 = days_passed(end_da);
int whole_year = end_da.year - start_da.year;
if(whole_year >= 1)
{
if(__isleap(start_da.year))
{
sum_day = (366 - days1) + days2;
}
else
{
sum_day= (365 - days1) + days2;
}
for(mid_year = start_da.year + 1; mid_year < end_da.year; mid_year++)
{
if(__isleap(mid_year))
{
i++;
}
}
sum_day += (whole_year - 1) * 365 + i;//中间年份为闰年的+1
}
else if(whole_year == 0)//两个日期在同一年份的直接相减
{
sum_day = days2 - days1;
}
return sum_day; //返回两个日期相差的天数
}
int main(void)
{
struct DATE start_da;
struct DATE end_da;
int sum_day = 0;
start_da.year = 2019;
start_da.mon = 2;
start_da.day = 28;
end_da.year = 2021;
end_da.mon = 3;
end_da.day = 1;
sum_day = diff_day(start_da, end_da) ;
printf("sum_day = %d",sum_day);
}