2016-09-07 73 views
0

大家好我正在開展一個關於計算特定工作日的項目。 我的條件是:週六不是假期,這是工作日。排除兩天之間的假期

我寫了這個代碼everyting是星期天只有okey跳過,但我想跳過,如果包含假期日期。

問題:跳過週日但不跳過傳遞的假期列表值。

將來的日期計算功能:

public DateTime CalculateFutureDate(DateTime fromDate, int numberofWorkDays, 
            List<DateTime> holidays) 
{ 
    var futureDate = fromDate; 
    for (var i = 0; i < numberofWorkDays; i++) 
    { 
     if (
      futureDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(futureDate))) 
     { 
      futureDate = futureDate.AddDays(1); 
      numberofWorkDays++; 
     } 
     else 
     { 
      futureDate = futureDate.AddDays(1); 
     } 
    } 
    while (
      futureDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(futureDate))) 
    { 
     futureDate = futureDate.AddDays(1); 
    } 

    return futureDate; 
} 

主要功能:

List<DateTime> holidayslist = new List<DateTime>(); 
holidayslist.Add(new DateTime(2016, 09, 7)); 
holidayslist.Add(new DateTime(2016, 09, 8)); 
holidayslist.Add(new DateTime(2016, 09, 9)); 
DateTime izinbaslangic = Convert.ToDateTime(dtpİzinBaslangicTarihi.Value, System.Globalization.CultureInfo.CreateSpecificCulture("tr-TR").DateTimeFormat); 
dtpİzinBitisTarihi.Value = CalculateFutureDate(izinbaslangic, Int32.Parse(tbİzinGunu.Text), holidayslist); 

輸入:izinbaslangic - >的DateTimePicker值和workingdays - > tbizingunu值

期待輸出:排除假日和週末在另一個datetimepicker顯示新的日期。

輸出:只跳過Weekends.Not跳過節假日。

期待輸出圖像:enter image description here

+3

這將真正幫助,如果你提供一個[MCVE]顯示它不工作......我們不知道你的輸入,預期輸出和實際輸出是什麼。 –

+0

好吧,我現在編輯 – Sososo

+0

作爲一個猜測,你的datetimepicker返回一個日期和非午夜時間? – Phylogenesis

回答

3

我將重寫代碼以下列方式

public DateTime CalculateFutureDate(DateTime fromDate, int numberofWorkDays, 
            List<DateTime> holidays) 
{ 
    var futureDate = fromDate; 
    while (numberofWorkDays != 0) 
    { 
     if (!isHoliday(futureDate, holidays)) 
      numberofWorkDays--; 
     futureDate = futureDate.AddDays(1); 
    } 
    while (isHoliday(futureDate, holidays)) 
     futureDate = futureDate.AddDays(1); 
    return futureDate; 
} 

bool isHoliday(DateTime testDate, List<DateTime>holidays) 
{ 
    return (testDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(testDate.Date))); 
} 

的想法很簡單,直到所需的工作日數減少到零,以創建一個循環。同時隔離邏輯來測試一個假期將有很大的幫助更好地理解代碼,避免在同一邏輯的危險重複

List<DateTime> holidayslist = new List<DateTime>(); 
holidayslist.Add(new DateTime(2016, 09, 7)); 
holidayslist.Add(new DateTime(2016, 09, 8)); 
holidayslist.Add(new DateTime(2016, 09, 9)); 

DateTime start = new DateTime(2016,9,7); 
DateTime ending = CalculateFutureDate(start, 1, holidayslist); 
Console.WriteLine(ending.ToString()); // 12/09/2016 00:00:00 
+0

只在第二週的第一週工作,再次跳過節假日.. – Sososo

+0

你能提供使用的輸入?問題是一樣的嗎? – Steve

+0

輸入07.09.2016和1天輸出:08.09.2016現在 – Sososo

相關問題