我很难做到这一点。我正在创建一种在特定日期添加工作日的方法。 例如,我想在 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、周一-周日、周六-周五……甚至是完全奇怪的值。我只比较相等性,这使得代码更“明显正确”。
关于C#:从特定日期添加工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717791/