分三种情况:
1、同年同月,相差为日数
2、同年,不同月,相差为月数+日数
3、都不同,相差年数+月数+日数 ==(间隔的年(每个365/366)+小的日期到小日期年末+大日期年初到大日期)
#include <iostream>
using namespace std;
struct Data
{
int year;
int month;
int day;
};
//判断是否为润年
bool isLeapYear(int year){
if(year<0) return false;
if(year%4==0&&year%100!=0||year%400==0) return true;
else return false;
}
//交换两个日期
void swap(Data& data_1,Data& data_2){
Data temp=data_1;
data_1=data_2;
data_2=temp;
}
//日期data_1比data_2大
bool compare(Data data_1,Data data_2){
if((data_1.year>data_2.year)||
(data_1.year==data_2.year&&data_1.month>data_2.month)||
(data_1.year==data_2.year&&data_1.month==data_2.month&&data_1.day>data_2.day)){
return true;
}
return false;
}
//输入合法
bool check(Data data){
if(data.year<0||data.month<0||data.month>12||data.day<0||data.day>31)
return false;
else
return true;
}
//得到年初
Data yearBegin(Data data){
Data begin;
begin.year=data.year;
begin.month=1;
begin.day=1;
return begin;
}
//得到年末
Data yearEnd(Data data){
Data end;
end.year=data.year;
end.month=12;
end.day=31;
return end;
}
//得到同一年中两个日期间隔天数
int getDays(Data data_1,Data data_2){
int days=0;
int months[13]={0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(isLeapYear(data_1.year)){//润年2月天数为29
months[2]+=1;
}
for(int i=data_1.month;i<data_2.month;i++){
days+=months[i];
}
days+=data_2.day;
return days;
}
//计算间隔天数函数
int getIntervalDays(Data data_1,Data data_2){
if(!check(data_1)||!check(data_2))return -1;
int intervalDays=0;
if(compare(data_1,data_2)){
swap(data_1,data_2);
}
if(data_1.year==data_2.year){
if(data_1.month==data_2.month){
intervalDays+=data_2.day-data_1.day;
}else{
intervalDays+=getDays(data_1,data_2);
}
}else{
for(int i=data_1.year+1;i<data_2.year;i++){
if(isLeapYear(i)){
intervalDays+=366;
}else{
intervalDays+=365;
}
}
intervalDays+=getDays(data_1,yearEnd(data_1));
intervalDays+=getDays(yearBegin(data_2),data_2);
}
return intervalDays;
}