C++ 计算两个日期之间相差天数

黑历史 2013/07/3

代码如下:

#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的情况已在第二步计算过一次。
  • 最后结果统一起来。