這個計算機能做什麼
你有沒有好奇過,自己出生那天究竟是星期幾——是悠閒的星期天,還是忙碌的星期一?這款「生日星期計算機」會準確告訴你出生日期是星期幾,還會額外幫你算出下一次生日會落在星期幾。只要是西曆(格里曆)上的日期,它通通都能算。
使用方法
輸入你的出生年份,從下拉選單中選擇出生月份,再填入出生日。按下計算,上方的重點區塊會顯示你出生那天是星期幾,下方表格則會列出你即將到來的生日是星期幾,方便你提前安排慶生。
公式原理
本工具採用蔡勒公式(Zeller's congruence),這是一套用來推算任何日期星期的經典演算法。在計算時,一月和二月會被視為前一年的「第 13 個月」與「第 14 個月」。公式會算出一個數值 h,其中 0 代表星期六、1 代表星期日,依此類推。我們再將結果對應回大家熟悉的「週日到週六」順序來顯示。由於整個過程只用到整數運算,因此結果完全精確,不會有任何誤差累積。
$$h = \left( D + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + \left\lfloor \frac{J}{4} \right\rfloor + 5J \right) \bmod 7$$ $$\text{where}\quad \left\{ \begin{aligned} D &= \text{Birth Day} \\ m &= \text{Month}\ \ (\text{Jan,Feb} \to 13,14\text{ of prior year}) \\ Y &= \text{Birth Year}\ (\text{adjusted}) \\ K &= Y \bmod 100,\quad J = \left\lfloor Y/100 \right\rfloor \end{aligned} \right.$$
實際範例
以 1990 年 7 月 15 日為例。此時 \(m = 7\)、\(d = 15\)、年份為 1990,所以 \(k = 90\)、\(j = 19\)。接著 $$h =\left(15 + \left\lfloor 13\cdot 8/5 \right\rfloor + 90 + \left\lfloor 90/4 \right\rfloor + \left\lfloor 19/4 \right\rfloor + 5\cdot 19\right) \bmod 7 = (15 + 20 + 90 + 22 + 4 + 95) \bmod 7 = 246 \bmod 7 = 1$$ 對應到星期日。換句話說,1990 年 7 月 15 日出生的人,是在星期日出生的。
變數定義
- \(D\) — 月份的日期。 日期日數,完全按照書寫方式,從 1 到 31。\(D\) 不會進行任何調整。
- \(m\) — 調整後的月份編號。 三月 = 3 到十二月 = 12 按原樣使用。一月和二月是特殊情況: 它們分別被視為上一年的第 13 和 14 月。這是因為齊勒公式將三月視為一年的開始,這樣可以將閏日保持在週期的末尾。
- \(Y\) — 調整後的年份。 如果日期在一月或二月,從日曆年份中減去 1(因為在此方案中這些月份屬於前一年)。其他所有月份保持原始年份。
- \(K\) — 世紀年份。 \(K = Y \bmod 100\),即調整後年份的最後兩位數字。對於 2024 年這是 24;對於 1999 年這是 99。
- \(J\) — 零起始世紀。 \(J = \lfloor Y / 100 \rfloor\),世紀編號不進位。對於 2024 年這是 20;對於 1999 年這是 19。
- \(h\) — 結果日期代碼。 組合所有項後模 7 的餘數,給出 0–6 的值,該值使用上表的結果代碼映射到一週的某一天。
更多計算示例
示例 1 — 一月日期(顯示月份和年份偏移)
取 2000 年 1 月 15 日。因為月份是一月,設 \(m = 13\) 並使用前一年,所以調整後的年份是 \(Y = 1999\)。然後 \(D = 15\),\(K = 1999 \bmod 100 = 99\),以及 \(J = \lfloor 1999/100 \rfloor = 19\)。
$$h = \left(15 + \left\lfloor \tfrac{13(13+1)}{5} \right\rfloor + 99 + \left\lfloor \tfrac{99}{4} \right\rfloor + \left\lfloor \tfrac{19}{4} \right\rfloor + 5 \cdot 19 \right) \bmod 7$$
樓函數項為 \(\lfloor 182/5 \rfloor = 36\)、\(\lfloor 99/4 \rfloor = 24\) 和 \(\lfloor 19/4 \rfloor = 4\)。求和:\(15 + 36 + 99 + 24 + 4 + 95 = 273\)。然後 \(273 \bmod 7 = 0\),所以 \(h = 0\) → 星期六。2000 年 1 月 15 日確實是 星期六。
示例 2 — 閏日生日(2000 年 2 月 29 日)
對於 2000 年 2 月 29 日,二月也被偏移:\(m = 14\) 調整後的年份是 \(Y = 1999\),給出 \(K = 99\)、\(J = 19\) 和 \(D = 29\)。
$$h = \left(29 + \left\lfloor \tfrac{13(14+1)}{5} \right\rfloor + 99 + \left\lfloor \tfrac{99}{4} \right\rfloor + \left\lfloor \tfrac{19}{4} \right\rfloor + 5 \cdot 19 \right) \bmod 7$$
這裡 \(\lfloor 195/5 \rfloor = 39\)、\(\lfloor 99/4 \rfloor = 24\)、\(\lfloor 19/4 \rfloor = 4\)。求和:\(29 + 39 + 99 + 24 + 4 + 95 = 290\),\(290 \bmod 7 = 3\),所以 \(h = 3\) → 星期二。2000 年 2 月 29 日落在 星期二。請注意,2000 年是閏年,因為它能被 400 整除。
示例 3 — 最近的日期(2023 年 7 月 4 日)
對於 2023 年 7 月 4 日,七月是常規月份,所以 \(m = 7\) 不改變年份:\(Y = 2023\)、\(D = 4\)、\(K = 23\)、\(J = 20\)。
$$h = \left(4 + \left\lfloor \tfrac{13(7+1)}{5} \right\rfloor + 23 + \left\lfloor \tfrac{23}{4} \right\rfloor + \left\lfloor \tfrac{20}{4} \right\rfloor + 5 \cdot 20 \right) \bmod 7$$
樓函數值為 \(\lfloor 104/5 \rfloor = 20\)、\(\lfloor 23/4 \rfloor = 5\)、\(\lfloor 20/4 \rfloor = 5\)。求和:\(4 + 20 + 23 + 5 + 5 + 100 = 157\),\(157 \bmod 7 = 3\),所以 \(h = 3\) → 星期二。2023 年獨立日是 星期二。
常見問題
很久以前的日期也能算嗎?可以,任何「外推格里曆」上的日期都能計算。不過,1582 年曆法改革之前的日期,可能會與當時使用儒略曆的歷史記載有所出入。
閏年怎麼處理?蔡勒公式透過模運算自動處理閏年,所以 2 月 29 日這類日期也能正確算出。
如果今年的生日已經過了怎麼辦?若你今年的生日已經過去,「下次生日」的結果會自動往後推算到明年。