公众号旧文
计算天数:本月天数 − 开始日 + 结束日?
我经常在计算日期差时,遇到以下问题:
如果是在同一个月,例如:
- 7 月 15 日 → 7 月 28 日
计算非常简单:
28 - 15 = 13 天
但是一旦跨月,例如:
- 6 月 29 日 → 7 月 6 日
简单的减法就失效了。
对于只跨一个月的情况,其实有一个非常好记的公式:
跨月天数 = 本月总天数 − 开始日期 + 结束日期
例如:
6 月 29 日 → 7 月 6 日
= 30 - 29 + 6
= 7 天
那么,这个公式为什么成立?
一、先理解什么叫天数
计算日期差,本质上不是在数日期,而是在数经过了多少个 24 小时。
例如:
6 月 29 日 00:00
↓ 1 天
6 月 30 日 00:00
↓ 1 天
7 月 1 日 00:00
↓ 1 天
7 月 2 日 00:00
……
↓ 1 天
7 月 6 日 00:00
每跨过一个整天,就增加 1 天。
因此,从 6 月 29 日到 7 月 6 日,一共经过了 7 个整天。
二、把跨月拆成两段
跨月并不复杂,只要把它拆开即可。
第一段:
6 月 29 日
↓
7 月 1 日
第二段:
7 月 1 日
↓
7 月 6 日
总天数就是:
第一段 + 第二段
三、第一段怎么算?
第一段是:
开始日期
↓
下个月第一天
例如:
6 月 29 日
↓
7 月 1 日
需要经过:
29 → 30
30 → 1
共 2 天。
观察一下:
30 - 29 = 1
还少了一天。
实际上应该是:
30 - 29 + 1
=2
推广以后:
第一段
=
本月总天数 - 开始日期 + 1
例如:
30 - 29 + 1
=2
完全正确。
四、第二段怎么算?
第二段是:
下个月第一天
↓
结束日期
例如:
7 月 1 日
↓
7 月 6 日
经过:
1→2
2→3
3→4
4→5
5→6
共 5 天。
计算方法就是:
结束日期 - 1
例如:
6 - 1
=5
推广以后:
第二段
=
结束日期 - 1
五、两段相加
于是:
总天数
=
(本月总天数 - 开始日期 + 1)
+
(结束日期 - 1)
神奇的一幕出现了。
中间的:
+1
-1
正好抵消。
于是公式变成:
总天数
=
本月总天数
-
开始日期
+
结束日期
这就是我们看到的那个非常简洁的公式:
跨月天数 = 本月总天数 − 开始日期 + 结束日期
它并不是经验公式,而是由两段时间相加自然推导出来的。
六、这个公式适用于什么情况?
这个公式仅适用于只跨一个月的日期计算。
如果跨越多个自然月,例如:
2026-11-20
↓
2027-02-15
就不能直接使用这个公式了。
更通用的方法是把时间拆成多个自然月分别计算,或者直接使用编程语言提供的日期运算功能。
总结
同一个月:
结束日期 - 开始日期
跨一个月:
本月总天数 - 开始日期 + 结束日期