這是針對工作中的計劃。我現在無法訪問代碼,但我真的想知道這一點,所以我在家裏寫了一個快速程序,這是我工作項目的模仿。檢查選定日期是否在預定義假日的三天之內
我需要知道該日期是否在「假期」的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許可。
你可以在while循環中打包if(count> 0),因爲while循環只有當我們在選擇日期的3天得到假期時纔是必需的。 – Shah
@Shah謝謝你,你是對的。我更新了答案;) –
嘿@MikeMat :-)感謝您的幫助。你能幫我縮小我遇到的一個問題嗎?如果用戶選擇一個日期在20日以後,日期範圍現在是5天而不是3天(我知道這與計數檢查後.count沒有設置回0)有關,但我不知道解決這個問題的方法。偶然的想法?先生,謝謝你。 –