C# 比较循环中的日期时间范围
我有一个开始日期和结束日期,以及一个特定日期(假日)的列表。 从开始日期到结束日期,首先我确定是否有周末,如果有,我需要确定有多少天是周末,并将天数添加到结束日期,然后确定这些日期是否属于假日列表中的日期列表。同样,如果某个日期在假日列表中,我必须计算该天数,将其添加到末尾,然后再次运行循环 比如说。初始日期范围为2017年11月20日至2017年11月24日。第一次检查周末将返回0,然后我检查假期,这将返回2(23和24),然后我需要调整日期,使我的新范围从11/20到11/26,我必须再次循环周末,并将发现2天在周末。下面的代码我作弊了,因为我知道背靠背的假期从来不会超过2次,但它的代码非常繁琐 另外,请考虑一下周末是第一次,其次是节假日,一旦你调整了最初的周末。p> 我从来没有一个问题,只是周末,它是唯一的假期,我被赋予了错误的价值。下面的代码运行良好,我只是想看看如何改进它的建议。我已经尝试了循环,而这是唯一一个似乎有效的场景。谢谢你的帮助C# 比较循环中的日期时间范围,c#,loops,datetime,C#,Loops,Datetime,我有一个开始日期和结束日期,以及一个特定日期(假日)的列表。 从开始日期到结束日期,首先我确定是否有周末,如果有,我需要确定有多少天是周末,并将天数添加到结束日期,然后确定这些日期是否属于假日列表中的日期列表。同样,如果某个日期在假日列表中,我必须计算该天数,将其添加到末尾,然后再次运行循环 比如说。初始日期范围为2017年11月20日至2017年11月24日。第一次检查周末将返回0,然后我检查假期,这将返回2(23和24),然后我需要调整日期,使我的新范围从11/20到11/26,我必须再次循
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“只有在假期,我才被赋予了错误的价值。”(强调我的)