int main(void)
{
int yearB=0, monthB=0, dayB=0;
int yearE=0, monthE=0, dayE=0;
int difYear, difMonth;
// 輸入日期1
printf("Input the beginning date(yyyy.mm.dd)\n");
scanf("%d.%d.%d", &yearB, &monthB, &dayB);
// printf( "%d.%d.%d\n", yearB, monthB, dayB); 這行是我測試用的,甭管
// 檢驗日期1的合法性
switch(monthB)
{
case 2:
if( dayB<=0 || dayB>29 )
{
printf("Illegal date. exiting...");
exit(1);
}
else if( dayB==29 && !((yearB%4==0&&yearB%100!=0)||yearB%400==0) )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
case 4:
case 6:
case 9:
case 11:
if( dayB<=0 || dayB>30 )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if( dayB<=0 || dayB>31 )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
default:
printf("Illegal date. Exiting...");
exit(1);
break;
}
// 輸入日期2
printf("Input the end date(yyyy.mm.dd)\n");
scanf("%d.%d.%d",&yearE,&monthE,&dayE);
// printf("%d.%d.%d\n", yearE, monthE, dayE); 甭管
// 檢驗日期2的合法性
switch(monthE)
{
case 2:
if( dayE<=0 || dayE>29 )
{
printf("Illegal date. Exiting...");
exit(1);
}
else if( dayE==29 && !((yearE%4==0&&yearE%100!=0)||yearE%400==0) )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
case 4:
case 6:
case 9:
case 11:
if( dayE<=0 || dayE>30 )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if( dayE<=0 || dayE>31 )
{
printf("Illegal date. Exiting...");
exit(1);
}
break;
default:
printf("Illegal date. Exiting...");
exit(1);
break;
}
// 檢驗日期1是否在日期2之前
if(
(yearB>yearE)
|| ((yearB==yearE)&&(monthB>monthE))
|| ((yearB==yearE)&&(monthB==monthE)&&(dayB>dayE))
)
{
printf("Error! Beginning date is later than end date. Exiting...\n");
exit(1);
}
// 相隔年數
if(monthE>monthB || (monthE==monthB&&judge_lastDay(yearE,monthE,dayE)) )
{
difYear = yearE-yearB;
}
else
{
difYear = yearE-yearB-1;
}
// 相隔完整月數
if( judge_lastDay(yearE, monthE, dayE) )
{
difMonth = (monthE-monthB+12)%12;
}
else
{
difMonth = (monthE-monthB+11)%12;
}
// 輸出
printf( "There are %d year(s) and %d month(s) from beginning date to end date.\n", difYear, difMonth );
}
// 月末日期判斷函數
int judge_lastDay( int year, int month, int day )
{
switch(day)
{
case 28:
if( month==2 && !((year%4==0&&year%100!=0)||year%400==0) )
return 1;
break;
case 29:
if(month==2 && ((year%4==0&&year%100!=0)||year%400==0))
return 1;
break;
case 30:
if( month==4||month==6||month==9||month==11)
return 1;
break;
case 31:
if( month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 1;
break;
default:
return 0;
}
return 0;
}