C# 计算一周内没有循环的工作天数?
我需要计算给定结构的总工作天数,说明一周中的哪些天是工作的,以及从开始到现在的日期 我目前的算法是:C# 计算一周内没有循环的工作天数?,c#,algorithm,datetime,C#,Algorithm,Datetime,我需要计算给定结构的总工作天数,说明一周中的哪些天是工作的,以及从开始到现在的日期 我目前的算法是: protected int TotalWorkDays(DateTime From, DateTime dtTo,WorkedDays days) { int Days = 0; DayOfWeek DOW; for (DateTime curDate = From; curDate.Date <= dtTo.Date; curDat
protected int TotalWorkDays(DateTime From, DateTime dtTo,WorkedDays days)
{
int Days = 0;
DayOfWeek DOW;
for (DateTime curDate = From; curDate.Date <= dtTo.Date; curDate = curDate.AddDays(1))
{
DOW = curDate.DayOfWeek;
if ((DOW == DayOfWeek.Sunday & days.Sunday) |
(DOW == DayOfWeek.Monday & days.Monday) |
(DOW == DayOfWeek.Tuesday & days.Tuesday) |
(DOW == DayOfWeek.Wednesday & days.Wednesday) |
(DOW == DayOfWeek.Thursday & days.Thursday) |
(DOW == DayOfWeek.Friday & days.Friday) |
(DOW == DayOfWeek.Saturday & days.Saturday)
)
{
Days += 1;
}
}
return Days;
}
protected int TotalWorkDays(DateTime From、DateTime dtTo、WorkedDays)
{
整数天=0;
周道指;
对于(DATE TimeDe==from;CurDel.DATE < P>)求出从日期到日期之间的周数(使用减法和除法)。然后乘以每周工作的天数。对结束情况做一些减法(从/到日期在一周中)。< /P> < P> HMMM……/P>
创建一个字典,从DayOfWeek
(int
,如果我没记错的话),到bool
,然后
var DaysWorked = (from dayoffset in Enumerable.Range(0, (To - From).TotalDays)
where WorkingDays[From.AddDays(dayoffset).DayOfWeek]
select dayoffset).Count();
但效率不高!看看这篇文章,它解释了如何在没有循环的情况下完成这项工作;)
编辑:以下是它使用的公式:
以周为单位计算时间跨度的数量
从周数中扣除第一周。W=W-1
将周数乘以每周工作天数。
叫它D
找出指定时间范围内的假期。称之为H
计算第一周的天数,称之为SD
计算一下上周的天数,艾德
总结所有的日子。BD=D+SD+ED� H
您可以利用一周中每七天重复一次的事实。以下是算法的基本概要:
计算第一部分周的工作天数
计算最后一周的工作天数
计算整个周数在中间,乘以一周工作天数。
将上述三个值相加
var workDays=newdayofweek[]{DayOfWeek.Monday,DayOfWeek.周二};
var天数=总工作日(新日期时间(2005,1,12)、新日期时间(2005,3,15)、工作日);
受保护的整数总工作日(DateTime开始、DateTime结束、DayOfWeek[]工作日)
{
var weeks=(整数)数学下限((结束-开始).TotalDays/7);
var天数=周*工作日。长度;
//计算剩余
var d=开始添加天数(周*7);
而(d您可以使用以下算法:
- 计算开始一周的工作日(最多7次迭代)
- 计算开始/结束和多周之间的周数以及工作日
- 计算周末的工作日(最多7次迭代)
该样本使用了
@Jeff的可能重复-不是重复。这里的工作日是可配置的。但是如果你阅读了算法的工作原理,你就不需要循环。你所需要做的就是计算开始和结束周的工作日(如果是部分的话),其余的你可以计算出来,因为你知道你每周工作多少天基本上是@Mannimarco说,但是codeproject网站上的公式将是您尝试做的事情的一个良好开端
var workDays = new DayOfWeek[]{ DayOfWeek.Monday, DayOfWeek.Tuesday};
var days = TotalWorkDays(new DateTime(2005,1,12), new DateTime(2005,3,15), workDays);
protected int TotalWorkDays(DateTime start, DateTime end, DayOfWeek[] workDays)
{
var weeks = (int)Math.Floor((end - start).TotalDays / 7);
var days = weeks * workDays.Length;
//Calc rest
var d = start.AddDays(weeks * 7);
while (d <= end)
{
if(workDays.Contains(d.DayOfWeek))
days++;
d = d.AddDays(1);
}
return days;
}
// ----------------------------------------------------------------------
public int CountWorkingDays( DateTime start, DateTime end, IList<DayOfWeek> workingDays )
{
if ( workingDays.Count == 0 )
{
return 0;
}
Week startWeek = new Week( start );
Week endWeek = new Week( end );
int dayCount = 0;
// start week
DateTime currentDay = start.Date;
while ( currentDay < startWeek.End )
{
if ( workingDays.Contains( currentDay.DayOfWeek ) )
{
dayCount++;
}
currentDay = currentDay.AddDays( 1 );
}
// between weeks
DateDiff inBetweenWeekDiff = new DateDiff( startWeek.End, endWeek.Start );
dayCount += inBetweenWeekDiff.Weeks * workingDays.Count;
// end week
currentDay = endWeek.Start.Date;
while ( currentDay < end )
{
if ( workingDays.Contains( currentDay.DayOfWeek ) )
{
dayCount++;
}
currentDay = currentDay.AddDays( 1 );
}
return dayCount;
} // CountWorkingDays
// ----------------------------------------------------------------------
public void CountWorkingDaysSample()
{
DayOfWeek[] workingDays = new [] { DayOfWeek.Monday, DayOfWeek.Tuesday };
DateTime start = new DateTime( 2011, 3, 1 );
DateTime end = new DateTime( 2011, 5, 1 );
Console.WriteLine( "working days: {0}", CountWorkingDays( start, end, workingDays ) );
// > working days: 19
} // CountWorkingDaysSample