我看过很多关于将工作日(不包括周末)添加到日期参数的帖子,我尝试使用其中的一些。但是,我选择的所有解决方案在某些情况下都失败了。 下面是我目前正在使用的代码:
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日 2012年11月25日的失败也是..以及类似的情况我想,输入日期是周末。
有人可以帮忙解决这些问题吗?或者提供更好的解决方案?
谢谢
答案 0 :(得分: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);
}
答案 1 :(得分: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
,实际上只是忽略那些日子。如果您希望当天(如果是工作日)也计入工作日的总量,您可能需要做一些小的调整,但除此之外,这应该像您描述的那样工作。