2017-11-11 111 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)有關,但我不知道解決這個問題的方法。偶然的想法?先生,謝謝你。 –

相關問題