2013-11-28 2 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); 

Good Luck!

+0

Обновлен ответ. Повторите попытку. – gpmurthy

0

Это даст вам самое remaider остались дни (исключая субботу и воскресенье) .The переменных start и end представляют начальные и конечные даты:

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, чтобы получить то, что вам нужно. Вот очень простой пример статического класса:

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); 

И если вы просто хотите, количество дней недели в TimeSpan сделать следующее:

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. 
Смежные вопросы