2017-11-11 250 views
2

这是针对工作中的计划。我现在无法访问代码,但我真的想知道这一点,所以我在家里写了一个快速程序,这是我工作项目的模仿。检查选定日期是否在预定义假日的三天之内

我需要知道该日期是否在“假期”的3个工作日内。如果是,则选定日期必须加1以跳过节假日。例如:

如果有一个节日上的“2018年1月19日”并且用户选择“2018年1月16日”,则程序必须跳过19然后设置截止日期如“01/20/2018”。现在,如果我做纯if/then语句,我可以让它按预期工作,,但问题变成:“如果01/19/2018和01/20/2018假期都是假的?”这是我卡住的地方。

在工作中,我正在使用一个已经有“MM/dd/yyyy”格式的日期列的SQL表(因此这些日期是我检查的列表源)。用户打开日历并选择一个日期。 我实际上是解析一个XML文件,它是由另一个实际触及数据库的方法创建的,然后使用XElement进行迭代,将所有这些日期放在字符串列表中。

这是我的假工作方案的代码:

 private void button1_Click(object sender, EventArgs e) 
     { 
     DateTime dt = DateTime.Now; 
     txtLog.Text = dt.ToString("MM/dd/yy") + Environment.NewLine; 
     List<string> allexemptdays = new List<string>(); 
     string[] days = { "11/19/2018", "11/20/2018" }; 

     foreach (string a in days) 
     { 
      allexemptdays.Add(a); 
     } 

     foreach (string a in allexemptdays) 
     { 
      ToLog(a); 
     } 

     DateTime eq = DateTime.Parse(txtDate.Text); 
     string thefrustrationisreal = eq.ToString("MM/dd/yy"); 

     if (Math.Abs(DateTime.Now.Subtract(eq).Days) <= 3) 
     { 
      MessageBox.Show("Date exemption found."); 
     } 

    } 

    private void ToLog(string a) 
    { 
     txtLog.Text += ("Array value to list: " + a + Environment.NewLine); 
    } 

    private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) 
    { 
     txtDate.Text = monthCalendar1.SelectionStart.ToString("MM/dd/yy"); 
    } 

很显然,我明白“DateTime.Now”并不反映我的要求,但我只是用DateTime类打的多。

简而言之:我正在创建一个包含日期的数组(类似于我的真实程序) 遍历它们,将它们添加到列表中。现在我需要检查所选日期是否在预定义日期的3天内从我的sql表中返回的值。

如果找到日期,则将截止日期向上移动一天;但是,如果找到连续的假期,则完全跳过这两个日期。我可以一个一个地做这个(如果/然后使用),但如果两个假期彼此背对背,这不起作用。

作为一个便笺,我希望能够判断选定的日期是否在3天内并移到另一个月份,但我想我可以使用DateTime处理它,检查一个月中的日期并在需要(或者我确信DateTime实际上可以为我做到这一点)。虽然此时此刻我并不担心这种担忧。


我确实接受Mike的回答,因为它确实按预期工作,但是!我现在有一个不同的问题

现在,“days.count()”在用户选择节假日之后的一个日期后保存一个持久数字。示例:选择2017年1月21日将返回“Janurary 26 2017”作为截止日期,因为它仍在计算受到该范围影响的假日的第20日和第21日,因为它应该将截止日期设置为“2017年1月24日”

我已经提供了所提供的代码,我找不到解决这个问题的好方法。我在想:

If(selectedDate.AddDays(3) >= holidaydate)然后通过日期时间列表检查另一天,但我仍然会让这种方式比它应该更复杂(我想。)


末进入我会做这个职位(我正在考虑这个职位现在解决):我选择

马特的回答也工作在一定程度上,我很欣赏他的帮助。问题是,.Count()永远不会重置,所以如果你经过假日日期,它总是保持在跳过的日期(所以不是在选定日期前3天,它会去(3 +总天数计))

倘若别人遇到这样的情况,这是我落得这样做:

下载了“WorkingDaysManagement”的提法,从指令https://github.com/Opturne/WorkingDaysManagement

我最终使用的代码是:

 private void button1_Click(object sender, EventArgs e) 
    { 
     txtLog.Text = null; 
     DateTime dt = DateTime.Now; 
     var sd = (DateTime.Parse(txtDate.Text)); 

     Console.WriteLine(sd.ToShortDateString()); 
     var listHolidays = new List<DateTime> 
     { 
      new DateTime(2017, 12, 24), 
      new DateTime(2017, 12, 25) 
     }; 

     var listWeekEnd = new List<DayOfWeek> 
     { 
      DayOfWeek.Saturday, 
      DayOfWeek.Sunday 
     }; 

     var helper = new WorkingDayHelper(listHolidays,listWeekEnd); 
     foreach(DateTime s in helper.GetSpanDates(sd,3)) 
     { 
      Console.WriteLine("Current iteration date: "+s.ToShortDateString()); 
     } 
     var nextworkday = (helper.GetSpanDates(sd, 3).Last().ToString()); 
     txtLog.Text += ("Next working day available: " + nextworkday + Environment.NewLine); 
     if(helper.IsWorkingDay(sd)==true) 
     { 
      txtLog.Text += ("It is a working a day." + Environment.NewLine); 
     } 
     else 
     { 
      txtLog.Text += ("NOT a working day!" + Environment.NewLine); 
     } 

     txtEndDate.Text = nextworkday; 
    } 

该插件的作者非常有礼貌,他的作品也符合MIT许可。

回答

2

假设您已将数据库中的所有日期字符串解析为List<DateTime>holidays。然后你可以做一些类似于:

// Parsed holidays in a list, we will use LINQ against it. 
var holidays = new List<DateTime> { 
    new DateTime(2017, 1, 19), 
    new DateTime(2017, 1, 20), 
}; 
// Selected Date. In your case it would be: DateTime.Parse(txtDate.Text); 
var selectedDate = new DateTime(2017, 1, 16); 

// Count how many holidays there are within 3 days from the selcted date. 
var count = holidays.Count(holiday => holiday - selectedDate <= TimeSpan.FromDays(3)); 

// Then add the count and 3 to the selected date 
var closingDate = selectedDate.AddDays(count + 3); 

// Now we have to make sure the closing date is not a holiday. 
if (count > 0) 
{ 
    int skipDays = 0; 
    while (holidays.Any(holiday => holiday == closingDate.AddDays(skipDays))) 
    { 
     // holidays list contains the date. Skip it. 
     skipDays++; 
    } 

    closingDate = closingDate.AddDays(skipDays); 
} 
+1

你可以在while循环中打包if(count> 0),因为while循环只有当我们在选择日期的3天得到假期时才是必需的。 – Shah

+0

@Shah谢谢你,你是对的。我更新了答案;) –

+0

嘿@MikeMat :-)感谢您的帮助。你能帮我缩小我遇到的一个问题吗?如果用户选择一个日期在20日以后,日期范围现在是5天而不是3天(我知道这与计数检查后.count没有设置回0)有关,但我不知道解决这个问题的方法。偶然的想法?先生,谢谢你。 –

相关问题