(注:本文所展示代码均为本人所写,不一定为最优)
我们首先用纯逻辑和手动计算来拆解日期模拟题,再来代码实现,看看这些问题的底层思路怎么玩明白~
一、基础日期计算:直接算"过几天是哪天"
即进位的思路:
日期模拟进位,++核心是低位(日)累计满当月天数,就向高位(月)进 1,同时低位重置;月累计满 12,就向年进 1,月重置 ,类似十进制"个位满 10 进 1 到十位",且要结合大小月、闰年(影响 2 月天数,即 2 月满 28 或 29 天才进位 )调整规则 。++
题目举例:2024年7月20日过45天是哪天?
-
先看当月剩余天数:7月有31天,20日到31日还剩31-20=11天;
-
剩下的天数往后推:45-11=34天,即进入8月;
-
8月有31天,34天超过31天,所以8月31天后还剩34-31=3天,进入9月;
-
结果:2024年9月3日。
代码实现如下:

二、闰年与特殊月份:必须记牢规则
++闰年规则(划重点!)++:
- ++能被4整除但不能被100整除的年份是闰年(如2020年);++
++- 能被400整除的年份也是闰年(如2000年)++;
- 平年2月28天,闰年2月29天,其他月份天数固定(1、3、5、7、8、10、12月31天,4、6、9、11月30天)。
代码实现判断闰年:

以上这两个函数均用于判断闰年,核心逻辑一致(满足能被 4 整除但不能被 100 整除,或能被 400 整除 ),差异在于:
leap_year1 :用 if - else 分支,先判断条件,再分别返回 true / false ,逻辑清晰直观。
leap_year2 :直接通过条件表达式返回结果,更简洁紧凑,代码量少 。(推荐算法题优先考虑)
题目举例:2024年2月1日到2024年5月1日共有多少天?
计算步骤:
-
2024年是闰年,2月有29天,2月1日到2月29日:29天;
-
3月31天,4月30天;
-
总天数:29+31+30=90天。
三.练习题
1.计算一年的第几天

解题思路:
-
先判断年份是否为闰年,确定2月天数。
-
依据月份,累加之前月份的天数(1、3、5等大月31天,4、6等小月30天,2月按平/闰年算)。
-
最后加上当月的天数,总和即为该日期是当年第几天。
参考代码如下:

2.日期差值
https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c?tpId=62\&\&tqId=29468\&rp=1\&ru=

参考代码
以上代码:
-
leapyear 函数:判断年份是否为闰年,依据能被4整除但非100整除,或能被400整除的规则 。
-
cntday 函数:先根据平闰年设置2月天数,通过循环累加当前日期前所有月份天数,再加上当日天数;若跨多年,循环累加之前每年的天数(闰年366天,平年365天 ),得到日期距起始的总天数。
-
main 函数:拆分输入日期的年、月、日,调用 cntday 分别算两日期总天数,用绝对值差加1(包含两端日期 ),输出结果,处理多组输入。
3.打印日期
参考代码:

以上 C++ 代码的解题思路如下:
-
闰年判断: leap_year 函数依据规则(能被 4 整除但非 100 整除,或能被 400 整除 )判断年份是否为闰年,用于确定 2 月天数。
-
数据初始化: main 函数里,定义年、日、月变量, arr 数组存储各月天数(下标对应月份,0 号元素无用 )。
-
处理输入与日期转换: while 循环读取年和天数,先根据闰年设置 2 月天数。通过循环,用总天数依次减去各月天数,同时月份递增,直到剩余天数小于当前月天数,确定最终月份。
-
格式化输出:依据月份和日期的位数(是否小于 10 ),分情况格式化输出完整日期,如补前导 0 ,让输出符合常见日期显示格式 。
4.累加日期

参考代码
以上代码用于日期累加,解题思路如下:
-
闰年判断: leap_year 函数按规则(能被4整除且非100整除,或能被400整除 )判断闰年,影响2月天数。
-
输入处理:读取测试用例数 n ,再依次读入年、月、日、待加天数。
-
日期推算:先根据闰年设置2月天数,将待加天数与当日天数合并。通过循环,用总天数减当前月天数、递增月份,若超12月则跨年并重置月份,同时更新闰年状态。
-
格式化输出:按月份和日期的位数补前导0,输出推算后的日期,处理完一组数据 n 减1,直到所有用例完成 。