2011-05-05 44 views
1

我正在開發c#.net解決方案,我必須根據提供的結束日期和持續時間(後天)計算開始日期而不用週末。計算結束日期和返回天數時的StartDate

即截止日期:2011年5月5日 迴天:5

開始日期=(2011年5月5日) - 5日(不包括週末)

開始日期= 29/04/2011

感謝你,

+0

見'AddBusinessDays()'在[這個答案](http://stackoverflow.com/questions/1044688/add-business-days-and-getbusinessdays/1044821#1044821),做'AddBusinessDays(結束日期,-5)'或使用[Fluent DateTime](http://fluentdatetime.codeplex.com/),它有一個類似的方法和更多的內容。 – 2011-05-05 01:22:41

+0

澄清(05/5/2011) - 5 =(28/04/2011),對吧?不是29/04/2011。要確定這是否是要求或錯字。 – 2011-05-05 04:20:46

回答

0

像這樣的東西可能是我會怎麼做:

DateTime CalcStartDate(DateTime endTime, int daysBack) 
{ 
    DateTime startTime = endTime.Date; 

    while (daysBack > 0) 
    { 
     startTime = startTime.AddDays(-1); 
     if (startTime.DayOfWeek != DayOfWeek.Saturday && startTime.DayOfWeek != DayOfWeek.Sunday) 
     { 
      --daysBack; 
     } 
    } 

    return startTime; 
} 

甚至更​​好,巴拉建議使用圖書館。日期和時間很雜亂,硬化/測試的庫通常是一個不錯的選擇。

+0

感謝所有分享他們關於這個問題的想法 – Zeon05 2011-05-05 04:56:36

+0

我試過這個,它對我有用.. public DateTime CalcStartDate(DateTime EndDate,int daysBack) { DateTime StartDate = EndDate; 對(INT I = 1;我 Zeon05 2011-05-05 05:05:07

0

我不知道你會怎麼早去。如果這是很多天,那麼循環遍歷這些日子可能會佔用很多CPU。那麼,可能不與現代處理器...

我決定實施一個沒有循環的解決方案。 我的代碼有點難以閱讀,但它應該是更高效的性能。

public static class DateTimeExtensions 
{ 
    public static DateTime SubtractBusinessDays(this DateTime fromDateTime, int days) 
    { 
     var subtractDays = days % 5; 
     var dayNumber = fromDateTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)fromDateTime.DayOfWeek; 
     var addDays = Math.Max(dayNumber - 5, 0); 
     var result = fromDateTime.AddDays(addDays - subtractDays - (days/5 * 7)); 
     if ((addDays + dayNumber) % 7 <= subtractDays) 
      result = result.AddDays(-2); 
     return result; 
    } 
} 
+0

謝謝大家分享你對這個問題的想法..我從馬特的回答中找出了一些邏輯,並重寫了下面的符合我的要求。 – Zeon05 2011-05-05 04:57:59

相關問題