月份计算器
结果
相隔整月数
- 整月之外的零头天数
- 18 天
- 结果日期
- 2026年7月1日
- 星期几
- 星期三
关于「月」的两个问题,用同一组输入一起答。第一个是两个日期之间相隔几个整月——2026 年 1 月 1 日到 9 月 19 日是八个月零 18 天,这 18 天会被如实报出来,而不是悄悄丢掉。第二个是把一个日期向前或向后平移指定的月数之后落在哪天。这两个不是一回事,因为一个月有 28 到 31 天:落点由目标月份决定,不由算术决定。
公式
相隔整月数 = 从起始日期到结束日期之间走满的完整日历月;落点日期 = 目标月份里的同一个日号,目标月没有那一天时夹取到当月最后一天
- startDate
- 第一个日期,同时也是被平移的那个日期
- endDate
- 第二个日期;与起始日期对调得到的整月数相同
- months
- 要平移几个整月;填负数就是往回移
- monthsBetween
- 只数整月——1 月 1 日到 12 月 31 日是 11 个月而不是 12 个,因为还差一天
- remainderDays
- 走满最后一个整月之后剩下的天数,可能是 0 到 30 之间的任何值
- resultDate
- 起始日期平移之后的落点,已经做过月末夹取
当期限是按月报出来的,就该用这个月份计算器:租约、保修、通知期、订阅、分期付款。这些场合整月才是对的单位,而零头天数告诉你的是一段期限到底走完了没有——12 个月的期限差一天没到期,它就不是 12 个月。默认的六个月同时把两个答案的形状摆出来了。它给不出小数月:半个月不是一个日历上存在的落点,所以月数必须是整数。
算例
2026 年 1 月 1 日到 9 月 19 日,以及从起始日往后六个月
- 从 2026 年 1 月 1 日走满八个整月,到 2026 年 9 月 1 日
- 9 月 19 日在这之后又过了 18 天,所以零头是 18 天,整月数仍然停在 8
- 这 18 天是关键:没有它,9 月 1 日和 9 月 19 日会读成同一个数
- 把起始日期往后平移六个月落在 2026 年 7 月 1 日,星期三
零头天数正是这一页要报四个数而不是一个数的原因。两段相差半个月的间隔,整月数可以都是八。
从 2026 年 1 月 31 日往后一个月
- 2026 年 2 月有 28 天,所以没有 31 日可以落
- 落点夹取到那个月的最后一天:2026 年 2 月 28 日
- 1 月 31 日到 3 月 1 日之间是一个整月再加一天
- 零头是 1 而不是 -30——拿日号相减会同时得到错的符号和错的大小
月末夹取和零头天数是同一条规则的两个侧面。把一个月当成三十天来实现的工具,两边都会错。
从 2024 年 1 月 31 日往后一个月
- 2024 年是闰年,所以二月有 29 天
- 夹取的目标日跟着移动:落点是 2024 年 2 月 29 日,星期四
- 整月数和零头没变,仍然是 1 和 1
- 与 2026 年那个例子相比只有落点不同,而且正好差一天
同样的操作、同样的日号,答案只差一天。把这两个例子分开的只有闰年这一件事。
一整年,用月来读
- 2026 年 1 月 1 日到 2027 年 1 月 1 日正好是 12 个月,所以零头是 0 而不是 1
- 这段间隔的天数是 365 天,但整月数是一个干净的 12
- 把起始日期平移 12 个月,回到一年后的同一个日号:2027 年 1 月 1 日
- 2027 年 1 月 1 日是星期五
这里 12 个月和 365 天说的是同一段间隔,到 2028 年它们就不再一致了——所以两个单位分开报,而不是互相换算。
局限
整月是按日历月走满来数的,不是拿天数除以一个平均月长。这意味着答案取决于月份落在哪里:1 月 1 日到 2 月 1 日是一个月,2 月 1 日到 3 月 1 日也是一个月,尽管前者 31 天、后者 28 天。月末夹取沿用电子表格软件的约定——落在目标月的最后一天,而不是顺延到下个月——所以从 29、30、31 日出发的平移可能移动的天数少于一个整月。月数必须是整数,因为小数月没有对应的落点;两个日期对调也不会让符号翻转,一段间隔的大小在哪个方向上都是一样的。
常见问题
- 2026 年 1 月 1 日到 9 月 19 日相差几个月?
- 八个整月零 18 天。从 1 月 1 日走满八个月落在 9 月 1 日,9 月 19 日在这之后 18 天。数成九个月则是往另一个方向错:第九个月要到 10 月 1 日才算走完。这一页的每个答案都是这样拆开的,所以两个数加起来永远等于真实的间隔。
- 日期加几个月怎么算?六个月后是哪天?
- 填入起始日期和月数,读落点日期。从 2026 年 1 月 1 日往后六个月是 2026 年 7 月 1 日,目标月够长时日号会原样保留。填负数就是往回移,从 2026 年 7 月 1 日减六个月回到 2026 年 1 月 1 日。
- 目标月份没有那一天怎么办?
- 落点夹取到那个月的最后一天。从 2026 年 1 月 31 日往后一个月是 2026 年 2 月 28 日,从 2024 年 1 月 31 日往后一个月是 2024 年 2 月 29 日。这条月末夹取是电子表格的规则,也是一次平移可能只走了 28 天而不是 31 天的原因。
- 为什么 1 月 1 日到 12 月 31 日只有 11 个月?
- 因为第十二个月还没走完。一个月是从某个日号走到下个月的同一个日号,所以第十二个月要到次年 1 月 1 日才闭合。2026 年 1 月 1 日到 12 月 31 日的整月数是 11,零头 30 天,而天数是 364 天。
- 两个日期谁在前谁在后有影响吗?
- 对整月数没有影响。两个日期对调会得到同一个答案,因为两个日期之间间隔的大小与你先读哪一个无关——1 月 1 日到 9 月 19 日、9 月 19 日到 1 月 1 日都是八个月零 18 天。唯一有正负之分的输入是要平移的月数,它是作用在第一个日期上的。
参考资料
- relativedelta — the dateutil module — dateutil 项目文档
- 才 28 号,怎么就月末了? — 科普中国(中国科学院紫金山天文台)