获取截止日期,包括对节假日、补班、双休的处理
话说月光族的小明申请办了一张信用卡,银行规定,在受理成功后10个工作日(假设正常双休不上班)之后将可领取信用卡。tags:小明的本次办卡业务将在那天完成?
分析需求:根据受理日期,由10个工作日这个限制条件,计算出截止日期即可,其中需要对正常双休,国家法定节假日,补班等情况进行处理。
解决方案:
1、创建表存放国家法定节假日和补班的日期数据。(国家每年都会发布新的假期数据)。
2、根据开始时间和有效工作日2个输入条件,输出截止日期。
代码段:
1 /// <summary> 2 /// 根据开始时间和有效工作日,计算得出截止日期,包括对节假日、补班、双休的处理 3 /// </summary> 4 /// <param name="dt">办理日期</param> 5 /// <param name="workDay">多少工作日</param> 6 /// <returns></returns> 7 public DateTime CalculateEndDate(DateTime dt, int workDay) 8 { 9 DateTime tempDate = dt; 10 while (workDay-- > 1) 11 { 12 //①判断是否是法定节假日 13 bool hoilday = false; 14 tempDate = IsHoilday(tempDate, ref hoilday); 15 if (hoilday) 16 continue; 17 //②判断是否是双休和补班 18 if (tempDate.DayOfWeek == DayOfWeek.Saturday || tempDate.DayOfWeek == DayOfWeek.Sunday) 19 { 20 tempDate = IsWeeked(tempDate); 21 continue; 22 } 23 //最后一天为周末,需要往后一个工作日推 24 if (workDay == 0 && (tempDate.DayOfWeek == DayOfWeek.Saturday || tempDate.DayOfWeek == DayOfWeek.Sunday)) 25 { 26 tempDate = IsWeeked(tempDate.AddDays(1)); 27 } 28 } 29 return new DateTime(tempDate.Year,tempDate.Month,tempDate.Day,23,59,59); 30 }
判断是否法定补班:
1 /// <summary> 2 /// 检查是否为法定补班 3 /// </summary> 4 /// <param name="dt">日期</param> 5 /// <returns></returns> 6 private DateTime IsWeeked(DateTime dt) 7 { 8 bool isWorkday = false; 9 DateTime tempDate = dt; 10 bool result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.补班); 11 if (!result) 12 { 13 while (!isWorkday) 14 { 15 tempDate = tempDate.AddDays(1); 16 result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.补班); 17 if (!result) 18 { 19 tempDate = tempDate.AddDays(1); 20 isWorkday = true; 21 break; 22 } 23 } 24 } 25 return tempDate; 26 }
判断是否为节假日放假:
1 /// <summary> 2 /// 判断是否为节假日放假 3 /// </summary> 4 /// <param name="dt">日期</param> 5 /// <param name="isHoilday">初始化</param> 6 /// <returns></returns> 7 private DateTime IsHoilday(DateTime dt, ref bool isHoilday) 8 { 9 DateTime tempDate = dt; 10 bool result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.法定节假日); 11 if (!result) 12 tempDate = tempDate.AddDays(1); //正常上班日 13 else 14 { 15 //是节假日 16 while (!isHoilday)//往前推,直到不是节假日为止 17 { 18 tempDate = tempDate.AddDays(1); 19 result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.法定节假日); 20 if (!result) 21 { 22 isHoilday = true; 23 break; 24 } 25 } 26 } 27 return tempDate; 28 }