公众号旧文

计算天数:本月天数 − 开始日 + 结束日?

作者:胖子阅读 —

我经常在计算日期差时,遇到以下问题:

如果是在同一个月,例如:

  • 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

就不能直接使用这个公式了。

更通用的方法是把时间拆成多个自然月分别计算,或者直接使用编程语言提供的日期运算功能。

总结

同一个月:

结束日期 - 开始日期

跨一个月:

本月总天数 - 开始日期 + 结束日期