有一年我想赶在中秋前一周回家,九月中旬就把那周的住处订了,结果那年中秋落在 10 月 6 日,我提前半个月白住了一个星期。另一回更简单:同事问"距离过年还有多少天",他手机上那个数字是 114,我拿日历一格一格数出来是 115,两个人谁也没说服谁。
后来我才知道这两件事分别踩在两个坑上:一个是农历节日在公历上会漂移,一个是日期差到底含不含当天没统一口径。这两条我现在都先问清楚再算。
同一个农历日期,在公历上每年都挪位置
正月初一、八月十五这种写法定的是农历日期,公历那头当然跟着动。原因很硬:一个朔望月约 29.53 天,12 个月约 354.36 天,而回归年约 365.2422 天,两头差将近 10.88 天。差出来的部分靠置闰月补,于是农历平年约 354 天、闰年约 384 天,同一节日相邻两年的距离就在这几档里跳。
我拿一份 2024 到 2030 年的预置表算过,落到公历上的样子是这样的:
| 节日(农历日期) | 这七年在公历上的落点 | 最早—最晚 | 相邻两年间隔 |
|---|---|---|---|
| 春节(正月初一) | 02-10、01-29、02-17、02-06、01-26、02-13、02-03 | 1 月 26 日—2 月 17 日,窗口 22 天 | 354、384、354、354、384、355 天 |
| 元宵节(正月十五) | 02-24、02-12、03-03、02-20、02-09、02-27、02-17 | 2 月 9 日—3 月 3 日,窗口 22 天 | 354、384、354、354、384、355 天 |
| 端午节(五月初五) | 06-10、05-31、06-19、06-09、05-28、06-16、06-05 | 5 月 28 日—6 月 19 日,窗口 22 天 | 355、384、355、354、384、354 天 |
| 中秋节(八月十五) | 09-17、10-06、09-25、09-15、10-03、09-22、09-12 | 9 月 12 日—10 月 6 日,窗口 24 天 | 384、354、355、384、354、355 天 |
| 重阳节(九月初九) | 10-11、10-29、10-18、10-08、10-26、10-15、10-04 | 10 月 4 日—10 月 29 日,窗口 25 天 | 383、354、355、384、354、354 天 |
所以"中秋那周"这种说法订东西时基本没用,必须换成具体年月日。我自己记过一笔:2024 年中秋是 9 月 17 日(周二),2025 年推到 10 月 6 日(周一),隔 384 天;2026 年又回到 9 月 25 日(周五),只隔 354 天。同一个农历日期,相邻两年能差出整整一个月。
公历固定日期的节日不漂日期,星期照漂。国庆都是 10 月 1 日,2024 周二、2025 周三、2026 周四、2027 周五、2028 周日、2029 周一、2030 周二。因为 365 除以 7 余 1、闰年 366 余 2,星期一年挪一格、闰年挪两格,2027 到 2028 那格便跳过了周六。要连休几天、要不要调休,看的其实是星期不是日期。
日期差要不要 +1,取决于含不含当天
"还有几天"这句话里有三种口径,而它们都自称正确答案。以今天 2026 年 10 月 15 日(周四)为基准,我把几个目标日都算了一遍:
| 目标日 | 只算两个日期之间(差值) | 含今天也含目标日 | 说明 |
|---|---|---|---|
| 2026-10-18 重阳(周日) | 3 天 | 4 天 | 最容易被差一天的一组 |
| 2026-12-25 圣诞(周五) | 71 天 | 72 天 | |
| 2027-01-01 元旦(周五) | 78 天 | 79 天 | 跨年:仍然只是两个日期相减 |
| 2027-02-06 春节(周六) | 114 天 | 115 天 | 我和同事争的就是这一组 |
| 2027-02-20 元宵(周六) | 128 天 | 129 天 |
差值口径的算法就是把两端都归到当天 00:00,相减再除以 86400000 取整。我用的 节日倒计时 走的就是这一种:节日当天显示 0 天,不额外加一。这个选择讲得干净——倒数到 1 的时候,谁都不会误以为那天已经是节日。
要 +1 的场景也确实存在:数"一共占用几天"时含首含尾才对。2024 年 2 月 1 日到 2 月 10 日春节,中间差 9 天,全算上是 10 天。所以我的处理是:问"还剩多少天"用差值,问"这段一共多少天"用差值加一,写下来一定补一句"是否含当天"。同事那次争不出结果,就是因为谁都没说这句。
跨年、以及"下一次"该取哪一次
节日清单里同一个名字一年只出现一次,可查询的时间点会落在两次出现之间。规则是:找该节日严格不早于今天的最近日期,找不到就说明超出数据范围。我踩过的坑有两种。
一种是数据表本身有覆盖年限。农历节日的日期不是公式能随手算准的——置闰要看实际观测,近似式容易在闰月那年翻车,所以正经做法都是查预置表。我用的那份表覆盖 2024 到 2030 年,2031 年的春节它给不出;这时显示空白或拿上一年日期硬套,都属于要人工查历书,不算工具出错。
另一种是"今年已经过去了"。公历节日我一般同时取今年和明年两次出现再挑,像元旦、圣诞这种年末的,跨年一趟就换了一次年份;农历节日因为公历日期本身会挪,取"最近的未来那次"是唯一稳的办法,按"同一个农历月份"猜公历位置一定会错。
要精确到时刻的场景我就不在日期上倒数了。比如节日前一天晚上十点提醒,那涉及具体时刻,我用 倒计时计时器 盯着剩余天时分秒;只需要"某天前推 N 天是几号",比如提前 15 天订东西,那是 时间加减计算 的活,它连结果日的星期一起给出来,省得我再数。
Q:为什么两个网站给我的"距离春节多少天"差一天?
口径不同。一个算的是两个日期之间的整天数(同一天为 0),另一个把今天也算进去了(同一天为 1)。数字都对,只是含不含当天的区别,问的时候带一句就清楚了。
Q:闰月对节日日期有什么影响?
影响相当大。有闰月那年农历一年约 384 天,同一节日相比上一年会向后推将近 19 天;平年约 354 天,则向前缩约 11 天。我逐年算过春节的相邻间隔:2024 到 2025 是 354 天,2025 到 2026 是 384 天,2026 到 2027 又回到 354 天。
Q:能不能自己套公式推农历节日?
我不建议。要精确就必须落到农历的月序与闰月安排上,而这些是历表算出来的,不是简单的除法式子。我更愿意查表,或者把公历日期定下来之后再倒推天数。
Q:清单里没有我想算的日子怎么办?
把它的公历日期先确定好(生日、结婚纪念日、公司的周年都是这种),再算日期差。这类"一次性目标日"用按目标日期倒数的工具更合适,不用塞进节日清单里。
Q:订年假到底该按哪个数?
我会往保守方向取:把今天算进去、把节日前的准备日也算进去,宁可多留一天。倒数给的是"还剩多少",请假要的是"我最晚哪天必须动",这两个数不该混用同一个口径。
现在再遇到"距离过年还有多少天"这类问句,我先回一句"含不含今天"。至于订住处那件事,我后来都是先把那一年的公历日期抄在纸上再去下单——去年那个 10 月 6 日的中秋,就是靠这一步躲过去的,虽然前一次已经赔了一周。