年、周、日期计算

 
  1. /// <summary>   
  2. /// 获取一年中指定的一周的开始日期和结束日期。开始日期遵循ISO 8601即星期一。   
  3. /// </summary>   
  4. /// <remarks>Write by vrhero</remarks>   
  5. /// <param name="year">年(1 到 9999)</param>   
  6. /// <param name="weeks">周(1 到 53)</param>   
  7. /// <param name="weekrule">确定首周的规则</param>   
  8. /// <param name="first">当此方法返回时,则包含参数 year 和 weeks 指定的周的开始日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。</param>   
  9. /// <param name="last">当此方法返回时,则包含参数 year 和 weeks 指定的周的结束日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。</param>   
  10. /// <returns>成功返回 true,否则为 false。</returns>   
  11. public static bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule, out DateTime first, out DateTime last)  
  12. {  
  13.     //初始化 out 参数   
  14.     first = DateTime.MinValue;  
  15.     last = DateTime.MinValue;  
  16.   
  17.     //不用解释了吧...   
  18.     if (year < 1 | year > 9999)  
  19.         return false;  
  20.   
  21.     //一年最多53周地球人都知道...   
  22.     if (weeks < 1 | weeks > 53)  
  23.         return false;  
  24.   
  25.     //取当年首日为基准...为什么?容易得呗...   
  26.     DateTime firstCurr = new DateTime(year, 1, 1);  
  27.     //取下一年首日用于计算...   
  28.     DateTime firstNext = new DateTime(year + 1, 1, 1);  
  29.   
  30.     //将当年首日星期几转换为数字...星期日特别处理...ISO 8601 标准...   
  31.     int dayOfWeekFirst = (int)firstCurr.DayOfWeek;  
  32.     if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;  
  33.   
  34.     //得到未经验证的周首日...   
  35.     first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1);  
  36.   
  37.     //周首日是上一年日期的情况...   
  38.     if (first.Year < year)  
  39.     {  
  40.         switch (weekrule)  
  41.         {  
  42.             case CalendarWeekRule.FirstDay:  
  43.                 //不用解释了吧...   
  44.                 first = firstCurr;  
  45.                 break;  
  46.             case CalendarWeekRule.FirstFullWeek:  
  47.                 //顺延一周...   
  48.                 first = first.AddDays(7);  
  49.                 break;  
  50.             case CalendarWeekRule.FirstFourDayWeek:  
  51.                 //周首日距年首日不足4天则顺延一周...   
  52.                 if (firstCurr.Subtract(first).Days > 3)  
  53.                 {  
  54.                     first = first.AddDays(7);  
  55.                 }  
  56.                 break;  
  57.             default:  
  58.                 break;  
  59.         }  
  60.     }  
  61.     //得到未经验证的周末日...   
  62.     last = first.AddDays(7).AddSeconds(-1);  
  63.     switch (weekrule)  
  64.       {  
  65.            case CalendarWeekRule.FirstDay:  
  66.                //周末日是下一年日期的情况...    
  67.                if (last.Year > year)  
  68.                    last = firstNext.AddSeconds(-1);  
  69.                else if (last.DayOfWeek != DayOfWeek.Monday)  
  70.                    last = first.AddDays(7 - (int)first.DayOfWeek).AddSeconds(-1);  
  71.                break;  
  72.            case CalendarWeekRule.FirstFourDayWeek:  
  73.                 //周末日距下一年首日不足4天则提前一周...    
  74.                if (last.Year > year && firstNext.Subtract(first).Days < 4)  
  75.                   {  
  76.                       first = first.AddDays(-7);  
  77.                       last = last.AddDays(-7);  
  78.                   }  
  79.                break;  
  80.            default:  
  81.                break;  
  82.       }  
  83.    return true;  
  84. }  

        /// <summary>
        /// 获取指定日期在某年的周数  

        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private int GetWeekOfYear(DateTime dt)
        {

            GregorianCalendar gc = new GregorianCalendar();

            return gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

        }

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值