日期差值计算

发布时间 2023-07-20 20:43:07作者: ASjun08

日期处理

日期差值的问题总会令人感到很头痛,因为总是需要处理平年瑞年带来的二月天数问题以及,大 月小月问题,然而这种日期差值问题往往有一个很直接了当的解决方式,即将小的那个日期循环不断加一,并计算每一次加一的次数,直到小的那个日期和大的那个日期相等为止。

需要注意,对天数进行加一操作时,当达到该月最大天数加一时,应当使当前月份进一,重置天数为1号,当月数达到13时,应使年份进一,月份重置为1月。

对于闰年平年以及大月小月的处理,不妨定义数组int month[13][2],其中,第二维中0表示平年,1表示闰年,闰年二月28,平年二月29。

int month[13][2] = {
    {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},
    {31,31},{30,30},{31,31}
};

为了方便取出平年闰年的月份数,需定义一个判断是否是闰年的函数:

bool isLeap(int year){
    return ((year%4 == 0 && year %100 != 0 )|| year % 400 == 0);
}

对于输入格式为20010308,20010308/10000将得到年份y,200100308%10000将得到月份和天数,将该结果除以100将得到月份m,将该结果对100取余将得到天数d。

C++的简单源码示例:

#include <iostream>
#include <stdio.h>
using namespace std;
//定义月份数组,第二维中第一个元素表示平年,第二个元素表示闰年
int month[13][2] = {
    {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},
    {31,31},{30,30},{31,31}
};
//判断平年,闰年
bool isLeap(int year){
    return ((year%4 == 0 && year %100 != 0 )|| year % 400 == 0);
}
int main()
{
    //输入两个日期,如20011208
    int time1,time2;
    scanf("%d %d",&time1,&time2);
    //如果第一个第日期小于第二个日期,交换他们的位置
    if(time1 > time2){
        int temp =time1;
        time1 = time2;
        time2 = temp;
    }
    //获得年份
    int y1 = time1 /10000;
    //获得月份
    int m1 = time1 % 10000/100;
    //获得天数
    int d1 = time1 % 100;
    int y2 = time2 /10000;
    int m2 = time2 % 10000/100;
    int d2 = time2 % 100;
    //间隔天数
    int result = 1;
    //当两个日期的年月日相等时,退出循环,有一个不满足则继续循环
    while (y1 < y2 || m1 < m2 || d1 < d2){
        //天数自增
        d1++;
        //当天数等于单前月份满天数+1,则月份进一,重置天数为1
        if(d1 == month[m1][isLeap(y1)] + 1) {
            m1++;
            d1 = 1;
        }
        //当月份进位到13时,年份进1,重置月份为1
        if(m1 == 13){
            y1 ++;
            m1 = 1;
        }
        //间隔天数加一
        result ++ ;
    }
    printf("%d\n",result);
    return 0;
}