0

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

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 日 11 月 25 日失败, 2012 也是.. 和我猜的类似情况,输入日期在周末。

有人可以帮忙解决这种情况吗?或者提供更好的解决方案?

谢谢

4

2 回答 2

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);
    }
于 2012-11-16T13:15:20.793 回答
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,实际上只是忽略了那些日子。如果您希望当天(如果是工作日)也计入工作日总数,则可能需要进行一些细微调整,但除此之外,这应该像您描述的那样工作。

于 2012-11-16T13:32:56.093 回答