幾個關於星期計算的方法(C#)

曹化宇發表於2014-08-19

在使用C#開發軟體時,我們可以使用.NET Framework中的DateTime結構(System名稱空間)來處理日期和時間;但是,在DateTime結構中卻少了一些關於星期的常用計算方法,比如:

  • 某一天是當年中的第幾周。
  • 某一天是當月中的第幾周。
  • 獲取星期幾的中文名稱。

以下就是這三個方法的實現,它們被定義在CDateTime類中:

public class CDateTime
{
    // 中文星期名稱
    private static string[] arrWeekDayName = 
    {"星期日","星期一","星期二","星期三",
            "星期四","星期五","星期六"};

    // 某一天是當年中的第幾周
    public static int WeekOfYear(DateTime dt)
    {
        DateTime firstDay = new DateTime(dt.Year,1,1);
        int firstSunday = (7 - (int)firstDay.DayOfWeek) % 7 + 1;
        int curDayOfYear = dt.DayOfYear;
        if (curDayOfYear < firstSunday)
            return 1;
        else if (firstSunday == 1)
            return (curDayOfYear - firstSunday) / 7 + 1;
        else
            return (curDayOfYear - firstSunday) / 7 + 2;
    }

    // 某一天是當月中的第幾周
    public static int WeekOfMonth(DateTime dt)
    {
        DateTime firstDay = new DateTime(dt.Year, dt.Month, 1);
        int firstSunday = (7 - (int)firstDay.DayOfWeek) % 7 + 1;
        if (dt.Day < firstSunday)
            return 1;
        else if (firstSunday == 1)
            return (dt.Day - firstSunday) / 7 + 1;
        else
            return (dt.Day - firstSunday) / 7 + 2;
    }

    // 獲取星期幾的中文名稱
    public static string WeekDayName(DateTime dt)
    {
        int dayOfWeek = (int)dt.DayOfWeek;
        return arrWeekDayName[dayOfWeek];
    }
}

WeekOfYear()和WeekOfMonth()方法

首先看WeekOfYear()和WeekOfMonth()方法,它們的演算法是基本一樣的。

firstDay變數用於確定當年或當月的第一天。

firstSunday變數用於儲存第一個週日是當年(或當月)的第幾天。

如果指定的日期早於第一個週日,則為第一週;否則通過這個日期與第一個週日相差的天數來計算它位於第幾周。

演算法中的關鍵在DayOfWeek列舉值中,其中,週日值為0,週一到週六的值分別為1到6,我們正是通過這些關鍵資料來計算的。

WeekDayName()方法

WeekDayName()方法實現非常簡單,有很多朋友使用if語句或switch語句來實現這一功能;而這裡,我們使用了一個字串陣列來儲存周幾的名稱,然後,通過DayOfWeek列舉值直接獲取相應的名稱。

這種使用陣列的方法稱為“表驅動法”,其特點是:

  • 以空間換時間,比條件語句有著更高的執行效率,特別是對於固定的、會經常呼叫的資料。
  • 程式碼便於閱讀和維護,簡單的程式碼會更加直觀。

相關文章