主要思想就是一点一点的将第一个时间加到第二个时间为止
/* count how many day between two dates
* ensure the first input date before second date
*
* input : xxxx xx xx
* input : xxxx xx xx */
#include <stdio.h>
int isleap(int year){
if(year % 400 == 0) /* 是400的倍数,就是闰年 */
return 1;
else if(year % 100 == 0) /* 不是400的倍数,但是它是100的倍数,就是平年 */
return 0;
else if(year % 4 == 0) /* 不是100的倍数,但是4的倍数,也是闰年 */
return 1;
}
int main(){
int y1, m1, d1, y2, m2, d2;
int n = 0;
static int days[2][13] = {
365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
};
printf("input first date :");
scanf("%d %d %d", &y1, &m1, &d1);
printf("input second date :");
scanf("%d %d %d", &y2, &m2, &d2);
if(y1 + 1 < y2){ /* 第一个年 + 1 后还小于第二个年 */
while(y1 + 1 < y2){
if(isleap(y1) == 1){ /* 若是闰年,直接加366 */
n += 366;
++y1;
}else{ /* 若是平年加365 */
n += 365;
++y1;
}
}
}
if(y1 + 1 == y2){ /* 第一个年和第二个年相差为一,比如2013和2014 */
if(isleap(y1) == 1){
n += (days[1][m1] - d1); /* 先将第一个年的那个月份加满 */
++m1; /* 将月份加到下一个月 */
for(; m1 <= 12; ++m1) /* 再把这一年加满 */
n += days[1][m1];
++y1;
m1 = 0;
}else{
n += (days[0][m1] - d1);
++m1;
for(; m1 <= 12; ++m1)
n += days[0][m1];
++y1;
m1 = 0;
}
}
if(y1 == y2){
if(isleap(y1) == 1){
if(m1 == 0){
for(m1 = 1; m1 < m2; ++m1)
n += days[1][m1];
n += d2;
}else if(m1 != m2){
n += (days[1][m1] - d1);
++m1;
for(; m1 < m2; ++m1)
n += days[1][m1];
n += d2;
}else{
n = d2 - d1;
}
}else{
if(m1 == 0){
for(m1 = 1; m1 < m2; ++m1)
n += days[0][m1];
n += d2;
}else if(m1 != m2){
n += (days[0][m1] - d1);
++m1;
for(; m1 < m2; ++m1)
n += days[0][m1];
n += d2;
}else{
n = d2 - d1;
}
}
}
printf("%d\n", n);
}