任意两日期天数差

#include<iostream>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<fstream>
#include<algorithm>
using namespace std;
class Date{
	public:
		int y,m,d;
		Date(int a,int b,int c){
			y=a;
			m=b;
			d=c;
		}
	
};

//判断平闰年 
bool leap(int y){ 
	if(y%100==0){
		if(y%400==0)return true;
		else return false;
	}
	else if(y%4==0)return true;
	else return false;
}

//计算[y1,y2)区间年的天数 
int sumY(int y1,int y2){
	int sum = 0;
	for(int i = y1;i<y2;i++){
		if(leap(i))sum+= 366;
		else sum+=365;
	}
	return sum;
}

//计算[M1,M2)区间月的天数 
int sumM(int M1,int M2,int y){
	int sum = 0;
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	for(int i = M1;i<M2;i++){
		if(i==2)sum+= a[i]+leap(y); 
      	else sum+=a[i];
	}
	return sum;
}

//计算两个日期相差天数 
int sumD(Date a,Date b){
	int mDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int day = 0;
	if(a.y==b.y){
		//计算该日期在该年的第几天 
		int day2A =  sumM(1,a.m,a.y)+a.d;
		int day2B = sumM(1,b.m,b.y)+b.d;
		return abs(day2A-day2B);
	}
	else if(a.y>b.y){
		day =  sumM(1,a.m,a.y) + a.d +  sumM(b.m+1,13,b.y)+ mDay[b.m]-b.d;//a年的前部分加上b年的后部分 
		if(b.m==2)day+=leap(b.y);// 补上后边部分可能落算的1天 
	}
	else if(a.y<b.y){
		day =  sumM(a.m+1,13,a.y) +mDay[a.m]-a.d+  sumM(1,b.m,b.y)+b.d;//a年的后部分加上b年的前部分
		if(a.m==2)day+=leap(a.y);// 补上后边部分可能落算的1天 
	}
	int y1 = min(a.y,b.y);
	int y2 = max(a.y,b.y);
	day += sumY(y1+1,y2);//统一处理中间的年份 
	return day;
}
int main(){
	//2011 11 11 周五
	Date a = Date(2018,4,21);
	Date b = Date(2020,1,1);
	cout<<sumD(a,b)<<endl; 
	
 return 0;
}


如果有更好的算法欢迎评论交流

猜你喜欢

转载自blog.csdn.net/qhlpptdyfn/article/details/80033717