您的位置:首页 > 其它

获取截止日期,包括对节假日、补班、双休的处理

2015-11-27 17:56 441 查看
话说月光族的小明申请办了一张信用卡,银行规定,在受理成功后10个工作日(假设正常双休不上班)之后将可领取信用卡。tags:小明的本次办卡业务将在那天完成?

分析需求:根据受理日期,由10个工作日这个限制条件,计算出截止日期即可,其中需要对正常双休,国家法定节假日,补班等情况进行处理。

解决方案:

    1、创建表存放国家法定节假日和补班的日期数据。(国家每年都会发布新的假期数据)。

    2、根据开始时间和有效工作日2个输入条件,输出截止日期。

代码段:

    /// <summary>
/// 根据开始时间和有效工作日,计算得出截止日期,包括对节假日、补班、双休的处理
/// </summary>
/// <param name="dt">办理日期</param>
/// <param name="workDay">多少工作日</param>
/// <returns></returns>
public DateTime CalculateEndDate(DateTime dt, int workDay)
{
DateTime tempDate = dt;
while (workDay-- > 1)
{
//①判断是否是法定节假日
bool hoilday = false;
tempDate = IsHoilday(tempDate, ref hoilday);
if (hoilday)
continue;
//②判断是否是双休和补班
if (tempDate.DayOfWeek == DayOfWeek.Saturday || tempDate.DayOfWeek == DayOfWeek.Sunday)
{
tempDate = IsWeeked(tempDate);
continue;
}
//最后一天为周末,需要往后一个工作日推
if (workDay == 0 && (tempDate.DayOfWeek == DayOfWeek.Saturday || tempDate.DayOfWeek == DayOfWeek.Sunday))
{
tempDate = IsWeeked(tempDate.AddDays(1));
}
}
return new DateTime(tempDate.Year,tempDate.Month,tempDate.Day,23,59,59);
}


判断是否法定补班:

    /// <summary>
/// 检查是否为法定补班
/// </summary>
/// <param name="dt">日期</param>
/// <returns></returns>
private DateTime IsWeeked(DateTime dt)
{
bool isWorkday = false;
DateTime tempDate = dt;
bool result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.补班);
if (!result)
{
while (!isWorkday)
{
tempDate = tempDate.AddDays(1);
result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.补班);
if (!result)
{
tempDate = tempDate.AddDays(1);
isWorkday = true;
break;
}
}
}
return tempDate;
}


判断是否为节假日放假:

    /// <summary>
/// 判断是否为节假日放假
/// </summary>
/// <param name="dt">日期</param>
/// <param name="isHoilday">初始化</param>
/// <returns></returns>
private DateTime IsHoilday(DateTime dt, ref bool isHoilday)
{
DateTime tempDate = dt;
bool result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.法定节假日);
if (!result)
tempDate = tempDate.AddDays(1); //正常上班日
else
{
//是节假日
while (!isHoilday)//往前推,直到不是节假日为止
{
tempDate = tempDate.AddDays(1);
result = OracleServiceFactory.LoadService<IHoildayService>().IsHoilday(tempDate, ENUM_节假日类型.法定节假日);
if (!result)
{
isHoilday = true;
break;
}
}
}
return tempDate;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: