Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较循环中的日期时间范围_C#_Loops_Datetime - Fatal编程技术网

C# 比较循环中的日期时间范围

C# 比较循环中的日期时间范围,c#,loops,datetime,C#,Loops,Datetime,我有一个开始日期和结束日期,以及一个特定日期(假日)的列表。 从开始日期到结束日期,首先我确定是否有周末,如果有,我需要确定有多少天是周末,并将天数添加到结束日期,然后确定这些日期是否属于假日列表中的日期列表。同样,如果某个日期在假日列表中,我必须计算该天数,将其添加到末尾,然后再次运行循环 比如说。初始日期范围为2017年11月20日至2017年11月24日。第一次检查周末将返回0,然后我检查假期,这将返回2(23和24),然后我需要调整日期,使我的新范围从11/20到11/26,我必须再次循

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

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

另外,请考虑一下周末是第一次,其次是节假日,一旦你调整了最初的周末。p> 我从来没有一个问题,只是周末,它是唯一的假期,我被赋予了错误的价值。下面的代码运行良好,我只是想看看如何改进它的建议。我已经尝试了循环,而这是唯一一个似乎有效的场景。谢谢你的帮助

   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;
    }
publicstaticintweekends(DateTime开始、DateTime结束、列出假日、布尔leftSpace)
{
整数天=0;
DateTime tempstart=start;
TimeSpan startEnd=结束-开始;
int currentDays=startEnd.Days;

对于(DateTime date=start;date r.date>=start.date&&r.date=end.date&&r.date,我没有测试它的性能,但它是有效的。List holidays是一个被跳过的日期列表,因为它们是假期

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;
    }
publicstaticint周末(DateTime开始、DateTime结束、列出假日)
{
整数天=0;
DateTime tempEnd=end;
TimeSpan startEnd=结束-开始;
int currentDays=startEnd.Days;
整数天=0;
int exclexweold=0;
int exclushdold=0;
而(当前天数>=0)
{
int EXCHOIDAYTEST=不包括节假日(开始、临时结束、节假日);
int excDayTest=不包括天(开始、结束);
如果(排除天数==(excDayTest+excHolidayTest))
{
打破
}
其他的
{
排除天数=休假测试+休假测试;
if(exclewold==0&&exclHDOld==0)
{
tempEnd=tempEnd.AddDays((excDayTest+excHolidayTest));
}
其他的
{
tempEnd=tempEnd.AddDays((excDayTest-exclewold));
tempEnd=tempEnd.AddDays((假期测试-不包括假期));
}
EXCLOWEOLD=excDayTest;
EXCLCHDOLD=休假测试;
}
天数=假期测试+假期测试;
现在--;
}
返程天数;
}
公共静态整数天(日期时间开始,日期时间结束)
{
整数天=0;

对于(DateTime date=start;date r.date>=start.date&&r.date,我没有测试它的性能,但它是有效的。List holidays是一个被跳过的日期列表,因为它们是假日

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;
    }
publicstaticint周末(DateTime开始、DateTime结束、列出假日)
{
整数天=0;
DateTime tempEnd=end;
TimeSpan startEnd=结束-开始;
int currentDays=startEnd.Days;
整数天=0;
int exclexweold=0;
int exclushdold=0;
而(当前天数>=0)
{
int EXCHOIDAYTEST=不包括节假日(开始、临时结束、节假日);
int excDayTest=不包括天(开始、结束);
如果(排除天数==(excDayTest+excHolidayTest))
{
打破
}
其他的
{
排除天数=休假测试+休假测试;
if(exclewold==0&&exclHDOld==0)
{
tempEnd=tempEnd.AddDays((excDayTest+excHolidayTest));
}
其他的
{
tempEnd=tempEnd.AddDays((excDayTest-exclewold));
tempEnd=tempEnd.AddDays((假期测试-不包括假期));
}
EXCLOWEOLD=excDayTest;
EXCLCHDOLD=休假测试;
}
天数=假期测试+假期测试;
现在--;
}
返程天数;
}
公共静态整数天(日期时间开始,日期时间结束)
{
整数天=0;

对于(DateTime date=start;date r.date>=start.date&&r.date),建议您将此代码review@BugFinder由于这段代码不能按预期工作,我建议不要使用它。请看一看。@mast-但他说它工作得很好!@BugFinder-他实际上是在说两者:)-
我从来不会对周末有任何问题…
下面的代码工作正常…
@BugFinder“只有在假期我才被赋予错误的值。”(我的重点)我建议你把这个带去编码review@BugFinder由于此代码不能按预期工作,我建议您不要使用它。请看一看。@mast-但他说它工作得很好!@BugFinder-他实际上是在说这两个:)-
我从来没有遇到过周末的问题…
下面的代码工作得很好…
@BugFinder“只有在假期,我才被赋予了错误的价值。”(强调我的)