如果你不需要考慮假期,我會建議你做這樣的事情:
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,星期一 - 星期日,星期六 - 星期五......還是即使有完全離奇的價值。我只比較平等,這使代碼更「明顯正確」。
喬恩,這將是更有效地使用'workingDaysToAdd = workingDaysToAdd 5%; date = date.AddDays(workingDaysToAdd); if(date.DayOfWeek == DayOfWeek.Saturday)date.AddDays(2); if(date.DayOfWeek == DayOfWeek.Sunday)date.AddDays(1);'而不是循環結構?只是好奇。 – Lazarus 2010-09-15 13:11:36
我測試了它,它對我確切需要的東西有效。你在飛行中做過嗎?在我發佈後不到5分鐘..人,這是相當真棒..但我會歡迎更有效的答案..謝謝btw .. – CSharpNoob 2010-09-15 13:15:00
我不會說這是低效的,但所有的事情都是相對的。答案佔預計數週,因此最多需要循環6次(工作日%5最多4次,週末最多2次)。不是一個巨大的打擊。 – 2010-09-15 13:17:49