【问题标题】:Comparing Range of DateTimes in a Loop比较循环中的日期时间范围
【发布时间】:2017-11-22 08:03:42
【问题描述】:

我有一个开始日期和一个结束日期以及一个具体日期(节假日)的列表。 从开始日期到结束日期,首先我确定是否有周末,如果有,我需要确定周末有多少天并将天数添加到结束日期,然后确定这些日期是否属于在假期列表中的日期列表中。同样,如果某个日期在假期列表中,我必须取该天数,将其添加到末尾并再次运行循环。

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

另外,请考虑是否先放周末,然后在调整最初的周末后放假。

我从来没有遇到过周末的问题,只是在假期我被赋予了错误的价值。下面的代码工作正常,我只是想看看如何改进它的建议。我尝试过 for 循环、while 循环,这是唯一可行的方案。感谢您的帮助。

   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;
    }

【问题讨论】:

  • 建议您将其用于代码审查
  • @BugFinder 由于此代码无法按预期工作,我建议不要这样做。请看their help center
  • @mast - 但他说效果很好!
  • @BugFinder - 他实际上是在说这两个 :) - I never have an issue with just weekends...The code below works fine...
  • @BugFinder “只有在节假日我才得到 错误 值。” (强调我的)

标签: c# loops datetime


【解决方案1】:

我还没有测试过它的性能,但它可以工作。假期列表是由于假期而被跳过的日期列表。

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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多