C# 检查所选日期是否在预定义假日的三天内

C# 检查所选日期是否在预定义假日的三天内,c#,datetime,c#-4.0,C#,Datetime,C# 4.0,这是一个工作中的程序。我现在无法访问代码,但我真的想弄清楚这一点,所以我在家里编写了一个模拟我工作项目的快速程序 我需要知道该日期是否在“假期”后的3个工作日内。如果是,则所选日期必须增加1以跳过假期。例如: 如果“2018年1月19日”有一个假日,并且用户选择了“2018年1月16日”,那么程序必须跳过第19个,然后将截止日期设置为“2018年1月20日”。现在,如果我做纯If/then语句,我可以让它按预期工作,但问题会变成:“如果2018年1月19日和2018年1月20日都是假日怎么办?”

这是一个工作中的程序。我现在无法访问代码,但我真的想弄清楚这一点,所以我在家里编写了一个模拟我工作项目的快速程序

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

如果“2018年1月19日”有一个假日,并且用户选择了“2018年1月16日”,那么程序必须跳过第19个,然后将截止日期设置为“2018年1月20日”。现在,如果我做纯If/then语句,我可以让它按预期工作,但问题会变成:“如果2018年1月19日和2018年1月20日都是假日怎么办?”这就是我被困的地方

在工作中,我使用的SQL表已经有一个“MM/dd/yyyy”格式的日期列(因此这些日期是我要检查的列表源)用户打开一个日历并选择一个日期。实际上,我正在解析一个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");
    }

该插件的作者很有礼貌地将他的工作也放在MIT许可证下。

假设您已将数据库中的所有日期字符串解析到一个
列表中,即
假日
。然后您可以执行以下操作

// 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);
}
//在列表中解析的假日,我们将使用LINQ对其进行处理。
var假日=新列表{
新日期时间(2017年1月19日),
新日期时间(2017年1月20日),
};
//所选日期。在您的情况下,它将是:DateTime.Parse(txtDate.Text);
var selectedDate=新日期时间(2017年1月16日);
//计算从选定日期起3天内有多少假期。
变量计数=假日。计数(假日=>holiday-selectedDate 0)
{
int skipDays=0;
while(holidays.Any(holiday=>holiday==closingDate.AddDays(skipDays)))
{
//假日列表包含日期。跳过它。
skipDays++;
}
closingDate=closingDate.AddDays(skipDays);
}

if(count>0)可以将while循环换行,因为while循环只有在选定日期的3天内才需要。嘿@MikeMat:-)谢谢你的帮助。你能帮我缩小我遇到的问题吗?如果用户选择的日期在20日之后,日期范围现在是5天而不是3天(我知道这与计数检查后.count未设置回0有关),但我不知道如何解决这个问题。有什么想法吗?非常感谢您,先生。@MichaelTucker在这种情况下,您可以使用一个整数变量来保存日偏移量,并根据所选日期设置值。例如,
var dayOffset=selectedDate.day>20?5:3
,然后在
TimeSpan.fromDayOffset]中使用该变量
var closingDate=selectedDate.AddDays(计数+日偏移量);
// 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);
}