相对日期法计算天数差

前言

C++大作业编写银行系统中问到了计算日期差的方法, 在此记录一种方便快捷的相对日期法, 同时收录一些日期计算相关的其他细节问题, 具体如下

正文

闰年判断

众所周知, 当一个非整百年的年份能够被4整除时, 该年份为闰年; 当一个整百年份能被400整除时, 该年份为闰年.

Date类中编写isLeap函数判断一个年份是否为闰年, 代码如下

1
2
3
4
5
6
7
bool Date::isLeap(int m_year)
{
if((m_year%100==0||m_year%400==0)&&(m_year%4==0||m_year%100!=0))
return true;
else
return false;
}

建表

由于一年中每月天数不同, 在计算当年内两日期天数差时不方便, 可以采用建表查表的方法创建一个数组, 记录每月一号到当年一月一号的天数

程序中, 使用DAYS_EACH_MONTH数组存放这组数据

1
2
// date.h
const int DAYS_EACH_MONTH[]={0,31,59,90,120,151,181,212,243,273,304,334,365};

计算相对日期

计算每个日期距离1年1月1日的天数, 再用欲求的两个日期的相对日期天数作减法, 算得两日期相距的天数.

使用date_trans函数将一个Date类由绝对日期转换成相对日期

1
2
3
4
5
6
7
8
// date.h
class Date
{
// ...
public:
int date_trans();
// ...
}

计算year年month月day日相对日期步骤如下

计算年

首先计算year年1月1日1年1月1日的天数差, 由于月日均相同, 至于要计算相差几年即可, 过程中需要注意, 闰年有366天, 判断该年为闰年时需要为总天数再+1

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// date.cpp

int Date::date_trans()
{
int day_sum=0;

for(int i=1;i<get_year();i++)
{
// 每年增加365天
day_sum+=365;
// 有闰年多加1天
if(isLeap(i))
day_sum++;
}
// ...

计算月

根据之前建立的DAYS_EACH_MONTH数组, 快速获得month月1日距离1月1日的天数并加入总和中

代码如下

1
2
3
// ...
day_sum+=DAYS_EACH_MONTH[get_month()-1];
// ...

计算日

由于前面已经算得年月之间的日期差, 此时只需求出year年month月1日距离year年month月day日的天数差, 将日期中的day加入天数总和中即可

1
2
3
4
5
		// ...
day_sum+=get_day();

return day_sum;
}

计算天数差

使用date_trans函数获得两日期的相对日期值, 再作差即可得到两日期的天数差

1
2
3
4
5
// date.cpp
int Date::date_cal(Date m_date)
{
return -m_date.date_trans()+date_trans();
}