AddWorkingDays的逻辑到目前为止

时间:2012-11-16 13:05:48

标签: c# datetime

我看过很多关于将工作日(不包括周末)添加到日期参数的帖子,我尝试使用其中的一些。但是,我选择的所有解决方案在某些情况下都失败了。 下面是我目前正在使用的代码:

private DateTime AddWorkingDays(DateTime dateValue, int noOfDays) 
    {
        // determine if we are adding or subtracting the days
        int nDirection = noOfDays < 0 ? -1 : 1;

        // move ahead the day of week
        int nWeekday = noOfDays % 5;
        while (nWeekday != 0)
        {
            dateValue = dateValue.AddDays(nDirection);
            if (dateValue.DayOfWeek != DayOfWeek.Saturday
                && dateValue.DayOfWeek != DayOfWeek.Sunday)
            {
                nWeekday -= nDirection;
            }
        }

        // move ahead the number of weeks
        int nDayweek = (noOfDays / 5) * 7;
        dateValue = dateValue.AddDays(nDayweek);

        return dateValue;
    } 

失败的示例方案: 日期:2012年11月24日(星期六),天数:5(或10) 结果:2012年12月1日(或2012年12月8日),预期结果为2012年11月30日 2012年11月25日的失败也是..以及类似的情况我想,输入日期是周末。

有人可以帮忙解决这些问题吗?或者提供更好的解决方案?

谢谢

2 个答案:

答案 0 :(得分:1)

此实现(实际上与您的实现非常相似)给出了您期望的结果:

    public static DateTime AddWorkingDays(this DateTime date, int days)
    {
        if (days == 0)
            return date;
        int sign = days < 0 ? -1 : 1;
        while (days % 5 != 0 || !date.IsWorkingDay())
        {
            date = date.AddDays(sign);
            if (!date.IsWorkingDay())
                continue;
            days -= sign;
        }
        int nWeekEnds = days / 5;
        DateTime result = date.AddDays(days + nWeekEnds * 2);
        return result;
    }

    public static bool IsWorkingDay(this DateTime date)
    {
        return !(date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday);
    }

答案 1 :(得分:0)

基本上,只要剩下startDate,您要做的就是为noOfDays添加一天。基本上,所有真正意味着我们需要某种计数器,如果这一天是周末,它不会增加。如果我们应用这种逻辑,它就变得非常简单:

    public static DateTime AddWorkingDays(DateTime startDate, int amount)
    {
        // It really is that simple!
        if (amount <= 0)
            return startDate;

        var ret = startDate;

        for (int i = 0; i < amount; )
        {
            var nextDay = ret.AddDays(1);

            // If it's saturday or sunday, just add it, but don't increment i. That way we'll
            // just keep going and virtually "skipping" the weekends.
            if (nextDay.DayOfWeek == DayOfWeek.Saturday || nextDay.DayOfWeek == DayOfWeek.Sunday)
            {
                ret = ret.AddDays(1);
                continue;
            }

            ret = ret.AddDays(1);
            i++;
        }

        return ret;
    }

基本上,所有代码都是采用您提供的开始日期以及您要添加的天数。它需要,并循环,直到它用完了几天才能添加。如果它在周末遇到一天,它就不会增加i,实际上只是忽略那些日子。如果您希望当天(如果是工作日)也计入工作日的总量,您可能需要做一些小的调整,但除此之外,这应该像您描述的那样工作。