#include<stdio.h>
#include<stdint.h>
#include<stdbool.h>
#include<stdlib.h>
uint32_t date_to_days(uint16_t y,uint8_t m,uint8_t d); //把日期转换成天数
bool is_leap(uint16_t y); // 判断是否是闰年
uint8_t get_month_days(uint16_t y,uint8_t m); //获取当月天数
bool is_date(uint32_t y,uint8_t m,uint8_t d); // 判断输入的日期是否合法
int main(int argc,const char* argv[])
{
uint16_t y=0;
uint8_t m=0,d=0;
printf("请输入第一个日期:\n");
scanf("%hd-%hhd-%hhd",&y,&m,&d);
if(!is_date(y,m,d))
{
printf("日期有误!\n");
return 0; /若日期有误,直接结束程序
}
uint32_t sum1 = date_to_days(y,m,d);
printf("请输入第二个日期:\n");
scanf("%hd-%hhd-%hhd",&y,&m,&d);
if(!is_date(y,m,d))
{
printf("日期有误!\n");
return 0;
}
uint32_t sum2 = date_to_days(y,m,d);
printf("两个日期相隔%hd天\n",abs(sum1-sum2));
}
bool is_date(uint32_t y,uint8_t m,uint8_t d)
{
return 0<y && 0<m && 13>m && 0<d && get_month_days(y,m)>=d;
}
bool is_leap(uint16_t y)
{
return 0==y%4 && 0!=y%100 || 0==y%400;
}
uint8_t get_month_days(uint16_t y,uint8_t m)
{
switch(m)
{
case 2:
return 28+is_leap(y); break;
case 4: case 6: case 9: case 11:
return 30; break;
default:
return 31;
}
}
uint32_t date_to_days(uint16_t y,uint8_t m,uint8_t d)
{
uint32_t sum=d-1;
for(int i=1; i<y; i++)
{
sum += 365+is_leap(i);
}
for(int i=1; i<m; i++)
{
sum +=get_month_days(y,i);
}
return sum;
}