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