Kim Larsen 公式是經典的「蔡勒公式」變體,可直接由年、月、日算出星期幾,無需查表。公式核心在於將 1 月、2 月視為上一年的 13 月、14 月,統一處理閏年邏輯。
W = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) mod 7
d:日m:月(1 月=13、2 月=14,年份 -1)y:年(已調整後)W:0=週日, 1=週一, ..., 6=週六///
/// 依年月日回傳中文星期字串
///
public static string CalculateWeekDay(int year, int month, int day)
{
// 1、2 月視為上一年的 13、14 月
if (month == 1) { month = 13; year--; }
else if (month == 2) { month = 14; year--; }
int w = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
// 調整為 1=週一 ... 7=週日
int weekIndex = (w == 0) ? 7 : w;
return weekIndex switch
{
1 => "星期一",
2 => "星期二",
3 => "星期三",
4 => "星期四",
5 => "星期五",
6 => "星期六",
7 => "星期日",
_ => throw new InvalidOperationException("不可能的星期索引")
};
}
Console.WriteLine(CalculateWeekDay(2024, 1, 1)); // 星期一
Console.WriteLine(CalculateWeekDay(2024, 2, 29)); // 星期四 (閏年)
Console.WriteLine(CalculateWeekDay(2004, 12, 9)); // 星期四
| 方案 | 優點 | 缺點 |
|---|---|---|
| Kim Larsen 公式 | 無相依、效能極高、適合嵌入式/離線環境 | 需自行處理輸入驗證 |
DateTime.DayOfWeek | 內建、自動處理曆法細節、可讀性佳 | 需建立 DateTime 物件、極高頻呼叫略有額外負擔 |
Kim Larsen 公式以簡潔的整數運算完成星期計算,是演算法面試經典題目,也適合無法引用完整 .NET Base Class Library 的受限環境。一般應用開發建議直接使用 DateTime.DayOfWeek 以提升可維護性。