去年我想趕在中秋前一週回家,九月中旬就把那週的住處訂了,結果那年的中秋落在 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 日的中秋賠掉一週之後,我都是先把當年的公曆日期抄在紙上再下單。