C# 获取一年中指定的一周的开始日期和结束日期的通用方法

来源:互联网 发布:淘宝主图图标素材 编辑:程序博客网 时间:2024/05/27 20:21

 根据日期获取周次 可以通过 DateTimeFormatInfo.CurrentInfo.Calendar.GetWeekOfYear(date,CalendarWeekRule rule,DayOfWeek day)方法。

 而通过周次获取周的开始日期和结束日期似乎没有直接可以使用的方法。搜索到的方法没有能包含rule和day参数的,自己写了一个。


记得引用命名空间 System.Globalization.

/// <summary>        /// 获取一年中指定的一周的开始日期和结束日期。        /// </summary>        /// <param name="year">年(1到9999)</param>        /// <param name="weeks">周(1到54) -因规则设置 存在54周,如CalendarWeekRule.FirstDay;DayOfWeek.Monday;2012-12-31;54周</param>        /// <param name="weekrule">确定首周的规则</param>        /// <param name="day">每周第一天的规则</param>        /// <param name="first">返回指定周的开始日期,失败则返回System.DateTime.MinValue</param>        /// <param name="last">返回指定周的结束日期,失败则返回System.DateTime.MaxValue</param>        /// <returns>成功返回true,否则为false</returns>        public bool GetDaysByWeek(int year, int weeks,CalendarWeekRule weekrule,DayOfWeek day,out DateTime first,out DateTime last)        {            //初始化out参数            first = DateTime.MinValue;            last = DateTime.MaxValue;            DateTime firstday = DateTime.MinValue;            DateTime second = DateTime.MinValue;            DateTime firstCurr = new DateTime(year,1,1);//当前年首日            DateTime FirstNext = new DateTime(year+1,1,1);//下一年首日            if (year < 1 | year > 9999) return false;            if (weeks < 1 | weeks > 54) return false;            //因规则设置 存在54周,排除非此种情况            if (DateTimeFormatInfo.CurrentInfo.Calendar.GetWeekOfYear(new DateTime(year, 12, 31), weekrule, day) < 54)            {                if (weeks == 54) return false;            }            //得到未经验证的周首日            int dayOfWeekFirst = (int)firstCurr.DayOfWeek;            switch (day)            {                case DayOfWeek.Sunday:                    {                        first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst);                    }                    break;                case DayOfWeek.Monday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        first = firstCurr.AddDays((weeks-1)*7-dayOfWeekFirst+1);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst+1);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 1);                    }                    break;                case DayOfWeek.Tuesday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        if (dayOfWeekFirst == 1) dayOfWeekFirst = 8;                        first = firstCurr.AddDays((weeks-1)*7-dayOfWeekFirst+2);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst + 2);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 2);                    }                    break;                case DayOfWeek.Wednesday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        if (dayOfWeekFirst == 1) dayOfWeekFirst = 8;                        if (dayOfWeekFirst == 2) dayOfWeekFirst = 9;                        first = firstCurr.AddDays((weeks-1)*7-dayOfWeekFirst+3);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst + 3);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 3);                    }                    break;                case DayOfWeek.Thursday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        if (dayOfWeekFirst == 1) dayOfWeekFirst = 8;                        if (dayOfWeekFirst == 2) dayOfWeekFirst = 9;                        if (dayOfWeekFirst == 3) dayOfWeekFirst = 10;                        first = firstCurr.AddDays((weeks-1)*7-dayOfWeekFirst+4);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst + 4);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 4);                    }                    break;                case DayOfWeek.Friday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        if (dayOfWeekFirst == 1) dayOfWeekFirst = 8;                        if (dayOfWeekFirst == 2) dayOfWeekFirst = 9;                        if (dayOfWeekFirst == 3) dayOfWeekFirst = 10;                        if (dayOfWeekFirst == 4) dayOfWeekFirst = 11;                        first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 5);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst + 5);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 5);                    }                    break;                case DayOfWeek.Saturday:                    {                        if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;                        if (dayOfWeekFirst == 1) dayOfWeekFirst = 8;                        if (dayOfWeekFirst == 2) dayOfWeekFirst = 9;                        if (dayOfWeekFirst == 3) dayOfWeekFirst = 10;                        if (dayOfWeekFirst == 4) dayOfWeekFirst = 11;                        if (dayOfWeekFirst == 5) dayOfWeekFirst = 12;                        first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 6);                        firstday = firstCurr.AddDays((1 - 1) * 7 - dayOfWeekFirst + 6);                        second = firstCurr.AddDays((2 - 1) * 7 - dayOfWeekFirst + 6);                    }                    break;                default:                    break;            }            //周首日是上一年的情况。。            if (firstday.Year < year)            {                switch (weekrule)                {                    case CalendarWeekRule.FirstDay:                        {                            if(weeks==1) first = firstCurr;                        }                        break;                    case CalendarWeekRule.FirstFullWeek:                        {                            first = first.AddDays(7);//顺延一周                            second = second.AddDays(7);                        }                        break;                    case CalendarWeekRule.FirstFourDayWeek:                        if (firstCurr.Subtract(first).Days >3) //周首日距年首日不足4天则顺延一周                        {                            first = first.AddDays(7);                            second = second.AddDays(7);                        }                        break;                    default:                        break;                }            }            if (weeks == 1)            {                //第一周的天数可能不足7天,用第二周的第一天减去1s                last = second.AddSeconds(-1);            }            else            {                //得到未经验证的周末日                last = first.AddDays(7).AddSeconds(-1);            }            //周末日是下一年日期的情况。。            if (last.Year > year)            {                switch (weekrule)                {                    case CalendarWeekRule.FirstDay:                        last = FirstNext.AddSeconds(-1);                        break;                    case CalendarWeekRule.FirstFullWeek:                        break;                    case CalendarWeekRule.FirstFourDayWeek:                        if (FirstNext.Subtract(first).Days < 4)                        {                            first = first.AddDays(-7);                            last = last.AddDays(-7);                        }                        break;                    default:                        break;                }            }            return true;        }


关于调用:

            DateTime first = DateTime.MinValue;            DateTime last = DateTime.MaxValue;            GetDaysByWeek(2013,53,CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Monday,out first,out last);            //first就是周开始日期;last就是周结束日期



0 0
原创粉丝点击