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

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

在C#中是这样的:

DateTime AddWorkingDays(DateTime specificDate, int workingDaysToAdd)
{
   return specificDate + (workingDaysToAdd - (all saturdays and sundays))
}

我不考虑计算上的特别假期,我只是想从字面上添加除星期六和星期日之外的日子。在此先感谢! =)


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

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;
}

效率低下,但易于理解。 对于高效版本,您可以像以前一样计算要添加的完整周数,但是可以从任何“当前星期几”和“剩余工作日数”添加到“要添加的实际日数” 。 然后,您可以计算出要添加的总天数,并在一次调用中完成。

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

请注意,它可能无法处理负面输入 - 我没有检查。

我使用的方法背后的原因之一是,它不依赖于我或代码读者知道DayOfWeek枚举中的值是什么。 我不在乎它是0-6,1-7,星期一 - 星期日,星期六 - 星期五......还是即使有完全离奇的价值。 我只比较平等,这使代码更“明显正确”。


一个很酷的方式(我认为)被放在一个扩展方法,如:

public static class DateTimeExtensions
{
    public static DateTime AddWorkingDays(this DateTime self, int days)
    {
        self = self.AddDays(days);
        while (self.DayOfWeek == DayOfWeek.Saturday || self.DayOfWeek == DayOfWeek.Sunday)
        {
            self = self.AddDays(1);
        }

        return self;
    }
}

所以你的最终代码将如下所示:

specificDate.AddWorkingDays(3);

以下是您需要的内容:

更新 :

public static DateTime AddWeekdays(DateTime start, int days)
    {
        int remainder = days % 5;
        int weekendDays = (days / 5) * 2;

        DateTime end = start.AddDays(remainder);

        if (start.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // fix for saturday.
            end = end.AddDays(-1);
        }

        if (end.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // add two days for landing on saturday
            end = end.AddDays(2);
        }
        else if (end.DayOfWeek < start.DayOfWeek)
        {
            // add two days for rounding the weekend
            end = end.AddDays(2);
        }

        // add the remaining days
        return end.AddDays(days + weekendDays - remainder);
    }
链接地址: http://www.djcxy.com/p/54883.html

上一篇: C#: Adding working days from a cetain date

下一篇: How can I get all days between two days?