计算指定年指定周的起止日期

搞个周计划,数据库设计只有年和周,客户还要看日期。。

木有办法,自己写来不及,网上找了段代码自己改了改。。

废话不多说,上代码。。

        // <summary>
        /// 获取一年中指定的一周的开始日期和结束日期。开始日期遵循ISO 8601即星期一。
        /// </summary>
        /// <remarks>Write by vrhero</remarks>
        /// <param name="year">年(1 到 9999)</param>
        /// <param name="weeks">周(1 到 53)</param>
        /// <param name="weekrule">确定首周的规则</param>
        /// <returns>成功返回 true,否则为 false。</returns>
        public bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule)
        {
            //初始化参数
            DateTime first = DateTime.MinValue;
            DateTime last = DateTime.MinValue;

            //不用解释了吧
            if (year < 1 | year > 9999)
                return false;

            //一年最多53周
            if (weeks < 1 | weeks > 53)
                return false;

            //取当年首日为基准
            DateTime firstCurr = new DateTime(year, 1, 1);
            //取下一年首日用于计算
            DateTime firstNext = new DateTime(year + 1, 1, 1);

            //将当年首日星期几转换为数字 星期日特别处理 ISO 8601 标准 
            int dayOfWeekFirst = (int)firstCurr.DayOfWeek;
            if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;

            //得到未经验证的周首日
            first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1);

            //周首日是上一年日期的情况
            if (first.Year < year)
            {
                switch (weekrule)
                {
                    case CalendarWeekRule.FirstDay:
                        first = firstCurr;
                        break;
                    case CalendarWeekRule.FirstFullWeek:
                        //顺延一周
                        first = first.AddDays(7);
                        break;
                    case CalendarWeekRule.FirstFourDayWeek:
                        //周首日距年首日不足4天则顺延一周
                        if (firstCurr.Subtract(first).Days > 3)
                        {
                            first = first.AddDays(7);
                        }
                        break;
                    default:
                        break;
                }
            }

            //得到未经验证的周末日
            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:
                        //周末日距下一年首日不足4天则提前一周
                        if (firstNext.Subtract(first).Days < 4)
                        {
                            first = first.AddDays(-7);
                            last = last.AddDays(-7);
                        }
                        break;
                    default:
                        break;
                }
            }
            return true;
        }


原文链接: http://hi.baidu.com/corbet/blog/item/1bb2982af3119329d42af1fd.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值