我这样做很麻烦。我正在创建一种在特定日期添加工作日的方法。
例如,我想在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/