代码如下:
#include <iostream>
#include <Windows.h>
using namespace std;
struct data
{//日期结构体年月日,与GetLocalTime格式相近
int wYear;
int wMonth;
int wDay;
};
bool runnian(int mf)
{//判断是否闰年
if (mf % 4 != 0 && (mf % 100 == 0 || mf % 400 != 0))
return false;
else
return true;
}
int dataD(data mf)
{//计算日期差
int sum = 0;
SYSTEMTIME time;
GetLocalTime(&time);//获取当前日期结构体
int yaerNum = time.wYear - mf.wYear;//获取两者的年份差
for (int i = mf.wYear + 1; i<time.wYear; i++)//遍历中间年份
{
if (runnian(i))//闰年多加一天
sum++;
}
sum += yaerNum * 365;//计算年份天数
bool flag = (time.wMonth - mf.wMonth)>0;//判断时间先后
if (flag)
for (int i = mf.wMonth; i < time.wMonth; i++)
{//从开始月份遍历到结束月份前一月份
switch (i)//根据月份不同,增加不同天数
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:sum += 31; break;//大月
case 2:if (runnian(mf.wYear)) sum++; sum += 28; break;//根据闰年多加一天
default:sum += 30;//小月
}
}
else
for (int i = time.wMonth; i < mf.wMonth; i++)
{//与上一循环相近
switch (i)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:sum -= 31; break;
case 2:if (runnian(time.wYear)) sum--; sum -= 28; break;
default:sum -= 30;
}
}
sum += (time.wDay - mf.wDay);//增加日差
return sum;
}
思路其实很简单:
- 计算中间年份天数,将月日视作一样。比如2012-2020,从2013-2019中间为每一闰年则+1,然后再加上(2020-2012)*365 。把2012,2020是否为闰年留到月份计算解决。
- 计算两月份之间时间差,将日视作一样。比如从2月到9月,可以看作完整的2月到8月。2.x-3.x为2月,8.x-9.x为8月。所以,在第一步留下来的残留问题,起始年与末尾年是否为闰年,看是否包含2月。不包含2月,是闰年都无影响。
- 直接计算日。2.29的情况已在第二步计算过一次。
- 最后结果统一起来。