去年我想赶在中秋前一周回家,九月中旬就把那周的住处订了,结果那年的中秋落在 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-16、10-05 | 10 月 5 日—10 月 29 日,窗口 24 天 | 383、354、355、384、355、354 天 |
两处要说明。元宵的窗口按同一年内的月日位置数:2 月 9 日到 3 月 3 日是 22 天,起点若跨过了 2 月 29 日就是 23 天。重阳那行我原先抄错最后两年,2029 年是 10 月 16 日(周二)、2030 年是 10 月 5 日(周六),最早落点因此是 10 月 5 日、不是 10 月 4 日,窗口改成 24 天,间隔逐条相减为 383、354、355、384、355、354。
"中秋那周"这种说法订东西基本没用,得换成具体年月日。我记过一笔:2024 年中秋 9 月 17 日(周二),2025 年推到 10 月 6 日(周一),隔 384 天;2026 年回到 9 月 25 日(周五),只隔 354 天。2026 年端午 6 月 19 日、中秋 9 月 25 日,与当年放假安排一致。同一个农历日期,相邻两年能差出整整一个月。
公历固定日期的节日不漂日期,星期照漂。国庆都是 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 天。所以我问"还剩多少天"用差值,问"这段一共多少天"用差值加一,写下来补一句"是否含当天"。同事那次争不出结果,就是因为谁都没说这句。
跨年、以及"下一次"该取哪一次
节日清单里同一个名字一年只出现一次,可查询时间点会落在两次出现之间。规则是:找严格不早于今天的最近一次,找不到就是超出数据范围。我踩过的坑有两种。
一种是数据有覆盖年限。农历节日的日期不是套个近似式就能算准的——现行农历按定朔、定气推算,统一取北京时间,再按国标 GB/T 33661-2017《农历的编算和颁行》颁行,闰月落在哪个月是推算的结果,所以正经做法都是查历表。我手头这份覆盖 2024 到 2030 年,2031 年的春节它给不出;这时显示空白或拿上一年的日期硬套,都属于数据覆盖不到,得另查历表。
另一种是"今年已经过去了"。公历节日我同时取今年和明年两次出现再挑;农历节日的公历日期本身会挪,取"最近的未来那次"是唯一稳的办法,按"同一个农历月份"猜公历位置一定会错。
要精确到时刻我就不在日期上倒数了。节日前一天晚上十点提醒这种涉及时刻的,我用 倒计时计时器 盯着剩余天时分秒;只要"某天前推 N 天是几号",比如提前 15 天订东西,那是 时间加减计算 的活,它连结果日的星期一起给,省得我再数。
Q:为什么两个网站给我的"距离春节多少天"差一天?
口径不同。一个算两个日期之间的整天数(同一天为 0),一个把今天也算进去(同一天为 1)。数字都对,只是含不含当天的区别。
Q:闰月对节日日期有什么影响?
影响相当大。有闰月那年农历一年约 384 天,同一节日相比上一年会向后推将近 19 天;平年约 354 天,则向前缩约 11 天。我逐年算过春节的相邻间隔:2024 到 2025 是 354 天,2025 到 2026 是 384 天,2026 到 2027 又回到 354 天。
Q:清单里没有我想算的日子怎么办?
把它的公历日期先确定好(生日、结婚纪念日、公司周年都是这种),再算日期差。这类"一次性目标日"用按目标日期倒数的工具更合适,不用塞进节日清单里。真要请年假,我会往保守方向取:把今天和节日前的准备日都算进去,宁可多留一天。
现在再遇到"距离过年还有多少天",我先回一句"含不含今天"。订住处那件事,去年那个 10 月 6 日的中秋赔掉一周之后,我都是先把当年的公历日期抄在纸上再下单。