比较循环中的DateTimes范围

时间:2017-11-22 08:03:43

标签: c# loops datetime

我有开始日期和结束日期以及特定日期(假期)列表。 从开始日期到结束日期,首先我确定是否有任何周末,如果有,我需要确定周末的天数并将天数添加到结束日期,然后确定是否有任何这些日期落空在假日列表中的日期列表中。同样,如果日期在假日列表中,我必须花费该天数,将其添加到最后并再次运行循环。

例如。初始日期范围是2017年11月21日至2017年11月24日。周末的第一次检查将返回0,然后我检查假期,那将返回2(第23和第24),然后我需要调整日期,以便我的新范围从11/20到11/26,我必须再次循环周末,并会在周末找到2天。等等。下面的代码我作弊,因为我知道背靠背的假期从不超过2个,但它的代码非常繁琐。

此外,请考虑周末是否排在第一位,然后在您调整初始周末后再进行假期。

我从来没有遇到过周末的问题,只有假期才会给我错误的价值。下面的代码工作正常,我只是想看看如何改进它的建议。我已尝试过循环,而循环,这是唯一似乎有效的方案。谢谢你的帮助。

   public static int weekends(DateTime start, DateTime end, List<DateTime> holidays, Boolean leftSpace)
    {
        int days = 0;

        DateTime tempstart = start;
        TimeSpan startEnd = end - start;
        int currentDays = startEnd.Days;
        for (DateTime date = start; date <= end; date = date.AddDays(1))
        {
            int dw = (int)date.DayOfWeek;
            if (dw == 0 || dw == 6)
            {
                days++;
            }

        }

        if (!leftSpace)
        {
            end = end.AddDays(days);
            if (end.DayOfWeek == 0)
            {
                end = end.AddDays(1);
                days++;
            }
            else if ((int)end.DayOfWeek == 6)
            {
                end = end.AddDays(2);
                days = days + 2;
            }
            Boolean holidayExist = false;
            int holidayCount = 0;
            foreach (DateTime holiday in holidays.Where(r => r.Date >= start.Date && r.Date <= end.Date))
            {
                days++;
                holidayCount++;
                holidayExist = true;
            }
            if (holidayExist)
            {
                DateTime tempend = end;
                end = end.AddDays(holidayCount);
                int newWeekend = 0;
                for (DateTime date = tempend; date <= end; date = date.AddDays(1))
                {
                    int dw = (int)date.DayOfWeek;
                    if (dw == 0 || dw == 6)
                    {
                        days++;
                        newWeekend++;
                    }

                }
                holidayExist = false;
                holidayCount = 0;
                DateTime holidayEnd = end.AddDays(newWeekend);
                foreach (DateTime holiday in holidays.Where(r => r.Date >= end.Date && r.Date <= holidayEnd.Date))
                {
                    days++;
                    holidayCount++;
                    holidayExist = true;
                }
                if (holidayExist)
                {
                    tempend = end;
                    end = end.AddDays(holidayCount);
                    for (DateTime date = tempend; date <= end; date = date.AddDays(1))
                    {
                        int dw = (int)date.DayOfWeek;
                        if (dw == 0 || dw == 6)
                        {
                            days++;
                        }

                    }
                }
            }
        }
        return days;
    }

1 个答案:

答案 0 :(得分:0)

我没有对性能进行测试,但它确实有效。列表假期是由于假期而被跳过的日期列表。

public static int weekends(DateTime start, DateTime end, List<DateTime> holidays)
    {
        int days = 0;

        DateTime tempEnd = end;
        TimeSpan startEnd = end - start;
        int currentDays = startEnd.Days;

            int exclusionDays = 0;
            int exclWEOld = 0;
            int exclHDOld = 0;
            while (currentDays >= 0)
            {
                int excHolidayTest = exclHolidays(start, tempEnd, holidays);
                int excDayTest = exclDays(start, tempEnd);
                if (exclusionDays == (excDayTest+ excHolidayTest))
                {
                    break;
                }
                else
                {
                    exclusionDays = excDayTest + excHolidayTest;
                    if (exclWEOld == 0 && exclHDOld == 0)
                    {
                        tempEnd = tempEnd.AddDays((excDayTest + excHolidayTest));
                    }
                    else
                    {
                        tempEnd = tempEnd.AddDays((excDayTest - exclWEOld));
                        tempEnd = tempEnd.AddDays((excHolidayTest - exclHDOld));
                    }
                    exclWEOld = excDayTest;
                    exclHDOld = excHolidayTest;

                }
                days = excDayTest + excHolidayTest;
                currentDays--;
            }



        return days;
    }
    public static int exclDays(DateTime start, DateTime end)
    {
        int exclusionDays = 0;
        for (DateTime date = start; date <= end; date = date.AddDays(1))
        {
            int dw = (int)date.DayOfWeek;
            if (dw == 0 || dw == 6)
            {
                exclusionDays++;
            }

        }
        return exclusionDays;
    }
    public static int exclHolidays(DateTime start, DateTime end, List<DateTime> holidays)
    {
        int exclusionHolidays = 0;

        foreach (DateTime holiday in holidays.Where(r => r.Date >= start.Date && r.Date <= end.Date))
        {
            exclusionHolidays++;
        }

        return exclusionHolidays;
    }