计算在给定时间段内的正常工作日

CSh*_*oob 8 c# algorithm datetime

需要一些帮助.我需要计算一个特定日期的正常工作日,例如,在我们国家,我们星期一到星期五有5个正常工作日,然后在代码中我需要排除星期六和星期日,当我在我的计算中使用它时.

我需要在C#中使用类似的算法:

    int GetRegularWorkingDays(DateTime startDate, DateTime endDate)
    {

       int nonWorkingDays = ((endDate - startDate) % 7) * 2;

       return (endDate - startDate) - nonWorkingDays;
    }
Run Code Online (Sandbox Code Playgroud)

我知道我的选秀很开心:(.提前致谢.=)

PS:伙计们请在下面投票选出最好/最快/最有效的答案.谢谢=)

Iai*_*ard 19

查看Code Project上的这个示例,该示例使用一种不涉及任何循环的非常有效的方式;)

它使用这种算法:

  1. 以周为单位计算时间跨度.叫它,W.
  2. 从周数减去第一周.W = W-1
  3. 将周数乘以每周的工作日数.叫它,D.
  4. 在指定的时间跨度内查找假期.叫它,H.
  5. 计算第一周的天数.叫它,SD.
  6. 计算上周的天数.叫它,ED.
  7. 总结所有的日子.BD = D + SD +ED H.

  • 这真的很关键.如果你有一个6或7(或66或77)周的跨度,你不需要一周又一周地跳过周六和周日.第一周和上周是特殊情况,你不知道跨度是否包括工作日或周末天,但大中间只是每周5个工作日减去假期.这将为您节省大量的计算. (5认同)

Jan*_*oom 5

单线!

int workingDays = Enumerable.Range(0, Convert.ToInt32(endDate.Subtract(startDate).TotalDays)).Select(i=>new [] { DayOfWeek.Saturday, DayOfWeek.Sunday }.Contains(startDate.AddDays(i).DayOfWeek) ? 0 : 1).Sum();
Run Code Online (Sandbox Code Playgroud)

或者更有效:

DayOfWeek currDay = startDate.DayOfWeek;
int nonWorkingDays = 0;

foreach(var i in Enumerable.Range(0, Convert.ToInt32(endDate.Subtract(startDate).TotalDays)))
{
     if(currDay == DayOfWeek.Sunday || currDay == DayOfWeek.Saturday) 
          nonWorkingDays++;
     if((int)++currDay > 6) currDay = (DayOfWeek)0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不称其为一句台词。我称这是一条很长的线:-) (3认同)