两天之内排除假期

时间:2016-09-07 08:13:57

标签: c# list datetime

大家好,我正在开展一个关于计算具体工作日的项目。 我的条件是:星期六不是假期,是工作日。

我写的这段代码每次只是跳过星期日,但我想跳过,如果包含假日日期。

问题:跳过星期日,但没有跳过传递假日列表值。

未来日期计算功能:

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 - &gt; datetimepicker值和工作日 - &gt; tbizingunu值

期望输出:在另一个datetimepicker新日期中排除假日和周末显示。

输出:仅跳过周末。不跳过假期。

期待输出图像:enter image description here

1 个答案:

答案 0 :(得分: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