C# 根據年份和周判斷周的第一天和最後一天

    /// <summary>
    /// 周的第一天
    /// CalendarWeekRule.FirstDay, DayOfWeek.Sunday
    /// </summary>
    /// <param name="year"></param>
    /// <param name="week"></param>
    /// <returns></returns>
    public static DateTime FirstDateOfWeek(int year, int week)
    {
        if (year < 1 || year > 9999)
            throw new ArgumentException("illegal year", "year");
        int maxWeek = MaxWeekOfYear(year);
        if (week < 1 || week > maxWeek)
            throw new ArgumentException("illegal week", "week");

        if (week == 1)
            return new DateTime(year, 1, 1);
        DateTime firstDayOfYear = new DateTime(year, 1, 1);
        DateTime day = firstDayOfYear.AddDays((week - 1) * 7);
        DateTime ret = day.AddDays(-Convert.ToInt32(day.DayOfWeek));
        return ret;
    }


    /// <summary>
    /// 周的最後一天
    /// </summary>
    /// <param name="year"></param>
    /// <param name="week"></param>
    /// <returns></returns>
    public static DateTime LastDateOfWeek(int year, int week)
    {
        if (year < 1 || year > 9999)
            throw new ArgumentException("illegal year", "year");
        int maxWeek = MaxWeekOfYear(year);
        if (week < 1 || week > maxWeek)
            throw new ArgumentException("illegal week", "week");

        DateTime ret;
        DateTime firstDay = FirstDateOfWeek(year, week);
        if (week == 1)//week==1
        {
            ret = firstDay.AddDays(6 - Convert.ToInt32(firstDay.DayOfWeek));
        }
        else//week>1
        {
            DateTime tempDay = firstDay.AddDays(6);
            DateTime yearLastDay = new DateTime(year, 12, 31);
            if (tempDay > yearLastDay)
                ret = yearLastDay;
            else
                ret = tempDay;
        }
        return ret;
    }
    //
    public static int MaxWeekOfYear(int year)
    {
        if (year < 1 || year > 9999)
            throw new ArgumentException("illegal year", "year");

        int maxDays = (DateTime.IsLeapYear(year) ? 366 : 365);

        DayOfWeek firstDayOfWeek = new DateTime(year, 1, 1).DayOfWeek;

        int beforeFirstSunday = (7 - Convert.ToInt32(firstDayOfWeek)) % 7;

        int remainDays = maxDays - beforeFirstSunday;

        int ret = (beforeFirstSunday % 7 == 0 ? 0 : 1);
        ret += (remainDays / 7);
        ret += (remainDays % 7 == 0 ? 0 : 1);

        return ret;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章