2013-11-28 94 views
2

我知道我可以用这个计算两个日期之间的天差:在C#中,我如何计算两个日期之间的工作日差异?

private int DaysFromStart(DateTime date, DateTime startDate) 
{ 
    var days = date.Subtract(startDate); 
    return (int)days.TotalDays; 
} 

,但现在我想通过两个日期之间的差异仅包括平日。因此,举例来说,如果起始日期是上周五和日期检查是在下周一则返回值是1。

+0

可能有所帮助:http://stackoverflow.com/questions/1617049/calculate-the-number-of-business-days-between-two-dates –

+1

'周五-Monday' =>' 1',那么'Friday-Saturday'和'Friday-Sunday'的结果是什么? –

+0

[计算C#中两个日期之间的平日数]可能的重复(http://stackoverflow.com/questions/1820173/calculate-the-number-of-weekdays-between-two-dates-in-c-sharp ) –

回答

6

考虑下面的代码片段...

int allDays = (int)date.Subtract(startDate).TotalDays; 
int weekDays = Enumerable 
       .Range(1, allDays) 
       .Select(day => startDate.AddDays(day)) 
       .Count(day => day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday); 

祝您好运!

+0

更新了答案。请重试。 – gpmurthy

0

这会给你的remaider天时间(不包括周日和周六)。该变量startend代表开始和结束日期:

int DaysLeft = 0; 
for (int i = 1;i <= (int)end.Subtract(start).TotalDays;i++) 
{ 
    DayOfWeek day = start.AddDays(i).DayOfWeek; 
    DaysLeft = (day == DayOfWeek.Sunday) || (day == DayOfWeek.Saturday)?DaysLeft:DaysLeft + 1; 
} 
0

我使用的扩展方法返回平日的量时间跨度,甚至是两个日期之间的完整日期列表,那么您可以针对IEnumerable运行一个lambda表达式来获得所需的内容。下面是静态类的一个非常基本的例子:

public static class TimeSpanextensions 
{ 
    public static IEnumerable<DateTime> GetDays(this DateTime start, DateTime end, bool returnWeekDays = false) 
    { 
     List<DateTime> daysInSpan = new List<DateTime>(); 
     //change following line to accomodate date format if needed 
     TimeSpan ts = start.Date - end.Date; 

     if(start < end) 
     { 
      DateTime _this = start; 

      while (_this < end) 
      { 
       _this = start.AddDays(1); 
       daysInSpan.Add(_this); 
      } 
     } 

     if(start > end) 
     { 
      DateTime _this = start; 
      while(_this > end) 
      { 
       _this = _this.AddDays(-1); 
       daysInSpan.Add(_this); 
      } 
     } 

     if(returnWeekDays) 
     { 
      return daysInSpan.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday); 
     } 

     return daysInSpan; 
    } 

我用这个用下面的例子:

public static IEnumerable<DateTime> WeekDays(DateTime one, DateTime two) 
    { 
     TimeSpan test = one - two; 

     return one.GetDays(two, true).ToList(); 
    } 

这是一个基本的例子,一个时间跨度的日子或平日返回作为实际工作类型,而不是TimeSpan返回的类型为int的TimeSpan日子。因此,如果您有两个日期StartDate和EndDate,则只需执行以下操作即可获取TimeSpane中存在的工作日。

int count = Start < EndDate ? 1 : -1; 
    DateTime newDate = StartDate; 
    List<DateTime> allDaysList = new List<DateTime(); 

    while(newDate != EndDate) 
    { 

     newDate = newDate.AddDays(count); //will eithr add or subtract a day 
     allDays.Add(newDate);   
    } 


    //now return either only weekdays days 
    allDays = allDays.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday); 

如果你只是想工作日的时间跨度计数执行以下操作:

int workDays = allDays.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday).Count(); 

也就是说不同的方式来处理这个问题。为了扩展这个,你只需创建一个静态方法,除了这个作为参数。例如:

List<DateTime> weekDaysOnly = StartsDate.GetDays(endDate).ToList(); 
//then once again do your business day lambda expression here to leave your list with weekdays only. Hope this helps. 
相关问题