Как в C # рассчитать разницу в будние дни между двумя датами?

Я знаю, что могу рассчитать разницу в днях между двумя датами, используя это:

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

но теперь я хочу получить разницу между двумя датами, включая только будние дни. Так, например, если дата начала была в пятницу, а проверяемой датой был следующий понедельник, то возвращаемое значение будет 1.


person leora    schedule 28.11.2013    source источник
comment
Возможно полезно: stackoverflow.com/questions/1617049/   -  person Simon Whitehead    schedule 28.11.2013
comment
Friday-Monday = ›1, так каковы результаты для Friday-Saturday и Friday-Sunday?   -  person King King    schedule 28.11.2013
comment
возможный дубликат Подсчитайте количество рабочих дней между двумя даты в C #   -  person Evan Trimboli    schedule 28.11.2013


Ответы (3)


Рассмотрим следующий фрагмент кода ...

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

Удачи!

person gpmurthy    schedule 28.11.2013
comment
Обновил ответ. Пожалуйста, попробуйте еще раз. - person gpmurthy; 28.11.2013

Это даст вам количество оставшихся дней работы (исключая воскресенье и субботу). Переменные 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;
}
person terrybozzio    schedule 28.11.2013

Я использовал метод расширения, чтобы вернуть количество дней недели в промежутке времени или даже полный список дней между двумя датами, затем вы можете запустить лямбда-выражение для 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.
person Casey    schedule 09.02.2014