2016-09-07 80 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

相关问题