首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 依據年月日計算星期幾:Kim Larsen 公式完整實作

     編輯:關於C#

演算法背景

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=週六

C# 實作程式碼

/// 
/// 依年月日回傳中文星期字串
/// 
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 以提升可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved