日期计算一直算是即简单又令人抓头的问题。
本次代码以“yyyymmdd”的两个日期,计算两个日期相差的天数。
总体的计算方式:
1、令date1存储小的日期,date2存储大的日期;
2、先忽略年份,计算出date2、date1中month+day到年头的天数,用两者天数相减即解决了除去年份部分的天数;
3、先算出date2和date1的年份差,年份差*365天 + 相间的闰年数即为年份中所差的天数。
4、结果 = 步骤2+步骤3的值
#include<iostream>
#include<algorithm>
using namespace std;
int month[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//初始化每个月份的天数
struct {
int year, month, day;
}d1,d2;
int main(){
int date1,date2; //存储输入的两个日期
cin >> date1 >> date2;
if(date1 > date2) swap(date1, date2);//令date1存储小的日期、date2存储大的日期
d1.year = date1/10000; d1.month = date1%10000/100; d1.day = date1%100;//截取对应部分的日期
d2.year = date2/10000; d2.month = date2%10000/100; d2.day = date2%100;
for(int i = 1; i < 13; ++i)
month[i] += month[i - 1]; // 令每个month[i]表示该月份之前的所有天数,如2月及其之前的所有天数
int ans = month[d2.month - 1] + d2.day - month[d1.month-1] - d1.day;//先计算日期2到年头的日期,减去,日期1到年头的日期。
if(d1.year % 4 == 0 && d1.year%100 || d1.year % 400 == 0) //如果日期1为闰年且月份大于2了,就是减少了1天
if(d1.month > 2) ans--;
if(d2.year % 4 == 0 && d2.year%100 || d2.year % 400 == 0)//如果日期2为闰年且月份大于2月了,就是加少了1天
if(d2.month > 2) ans++;
//算式 = 两个日期的年份差 + 日期2的闰年数量 - 日期1的闰年数量。
ans += month[12] * (d2.year- d1.year) + (d2.year/4 - d2.year/100 + d2.year/400) - (d1.year/4 - d1.year/100 + d1.year/400);
cout << ans;
return 0;
}