算法笔记之旅 | 日期之间天数计算

    科技2026-02-07  1

    目录

    计算两个日期中间的天数计算逻辑处理闰年以及年月天数情况处理正常逻辑年月一致年一致,月不一致年月都不一致 代码实现

    计算两个日期中间的天数

    日常刷题碰到的,有计算两个日期之间天数的,有计算两个日期工作日数目的。这一类题目逻辑上算不上太难。只是没碰到过的话,第一时间可能想不好怎么处理。这里贴出来一条计算方法。

    计算逻辑

    打个比方是2020.3.15-2020.5.5中间一共多少天? 首先是处理闰年,这是死方法,处理天数也是。

    处理闰年以及年月天数情况

    以下数组第一维用来判断是否是闰年

    int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } }; //非闰年,2月28天,闰年2月29天 int yeardays[2] = { 365,366 }; //非闰年365天,闰年366天 int isLearyear(int year) //判断闰年 { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return 1; else return 0; }

    处理正常逻辑

    年月一致

    直接计算天数差别

    if (year1 == year2 && month1 == month2) //假如年月一致 { sumdays = day2 - day1; }

    年一致,月不一致

    比如3月5日到5月15日,我们可以先计算3月还剩余天数,然后计算其中整个的月的天数,再加上最后一个5月的15天。

    if (year1 == year2) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天 { sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天 for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天 { sumdays += monthdays[isLearyear(year1)][i]; } sumdays += day2; //5月天数 5.1-5.5 一共5天 }

    年月都不一致

    首先处理第一个日期当月到年底的整月的天数计算两个日期中间整年天数再加上第二个日期最后的整月的天数最后加上第二个日期当月天数 sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期当月剩余天数 for (int i = month1; i < 12; i++) //第一个日期整月天数 sumdays += monthdays[isLearyear(year1)][i]; for (int i = year1 + 1; i < year2; i++) //两个日期中间整年天数 sumdays += yeardays[isLearyear(i)]; for (int i = 0; i < month2 - 1; i++) //第二个日期整月天数 sumdays += monthdays[isLearyear(year2)][i]; sumdays += day2; //第二个日期当月天数

    代码实现

    #include<bits/stdc++.h> using namespace std; int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } }; //非闰年,2月28天,闰年2月29天 int yeardays[2] = { 365,366 }; //非闰年365天,闰年366天 int isLearyear(int year) //判断闰年 { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return 1; else return 0; } int caldays(int year1, int month1, int day1, int year2, int month2, int day2) { int sumdays = 0; if (year1 == year2 && month1 == month2) //假如年月一致 { sumdays = day2 - day1; } else { if (year1 == year2) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天 { sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天 for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天 sumdays += monthdays[isLearyear(year1)][i]; sumdays += day2; //5月天数 5.1-5.5 一共5天 } else //年月都不一样 { sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期当月剩余天数 for (int i = month1; i < 12; i++) //第一个日期整月天数 sumdays += monthdays[isLearyear(year1)][i]; for (int i = year1 + 1; i < year2; i++) //两个日期中间整年天数 sumdays += yeardays[isLearyear(i)]; for (int i = 0; i < month2 - 1; i++) //第二个日期整月天数 sumdays += monthdays[isLearyear(year2)][i]; sumdays += day2; //第二个日期当月天数 } } return sumdays; } int main() { int year1, month1, day1, year2, month2, day2; cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2; int days = caldays(year1, month1, day1, year2, month2, day2); cout << days << endl; return 0; }

    效果如下:

    Processed: 0.022, SQL: 9