C#:从cetain日期添加工作日

CSh*_*oob 9 c# algorithm datetime

我这样做很麻烦.我正在创建一个在特定日期添加工作日的方法.例如,我想在2010年9月15日(星期三)之前增加3个工作日,该方法将于9月20日(下周一周一)返回.它无视周六和周日,因为它的非工作日..

在C#中有类似的东西:

DateTime AddWorkingDays(DateTime specificDate, int workingDaysToAdd)
{
   return specificDate + (workingDaysToAdd - (all saturdays and sundays))
}
Run Code Online (Sandbox Code Playgroud)

我不考虑计算上的特殊假期,我只是想在星期六和星期日之外添加日子..提前谢谢!=)

Jon*_*eet 18

如果你不需要考虑假期,我建议你这样做:

public static DateTime AddWorkingDays(DateTime specificDate,
                                      int workingDaysToAdd)
{
    int completeWeeks = workingDaysToAdd / 5;
    DateTime date = specificDate.AddDays(completeWeeks * 7);
    workingDaysToAdd = workingDaysToAdd % 5;
    for (int i = 0; i < workingDaysToAdd; i++)
    {
        date = date.AddDays(1);
        while (!IsWeekDay(date))
        {
            date = date.AddDays(1);
        }
    }
    return date;
}

private static bool IsWeekDay(DateTime date)
{
    DayOfWeek day = date.DayOfWeek;
    return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
Run Code Online (Sandbox Code Playgroud)

它效率低下,但很容易理解.对于一个有效的版本,你会制定出完整的周数为前添加,但随后有任何"周的当前日"的映射和"工作日留给添加"到"数实际天加上" .然后你可以计算出要添加的总天数,并在一次调用中完成.

编辑:就效率低下而言......这真的不是糟糕.它只会执行手动"这是一个周末"检查长达4天,这也不算太糟糕.特别是,尽管igor(发布时的当前)声称,它比他的方法更快,尽管有缺陷的基准;)

请注意,它可能还没有处理负输入 - 我没有检查过.

我正在使用的方法背后的原因之一是它不依赖于我或代码阅读器知道DayOfWeek枚举中的值是什么.我不在乎它是0-6,1-7,周一至周日,周六周五......或者即使有完全奇怪的价值观.我只比较相等,这使代码更"明显正确".

  • @Anmol:说实话,缺乏可读性使得搜索缺陷变得更加困难.这就是为什么我喜欢循环选项 - 它很容易理解,除非你知道你*正在增加很多工作日(在这个问题中不是这种情况),我更喜欢可读性而不是效率.此外,考虑到公共假期列表,从一个忽略公共假期的天真实施到包含公共假期的天真实施,这真的很容易 - 用计算版本来做同样的事情会更加困难. (3认同)