.NET Date Compare: подсчитайте количество рабочих дней с даты?

Какой самый простой способ вычислить количество рабочих дней с даты? VB.NET предпочтет, но С# в порядке.

И под "рабочими днями" я подразумеваю дни, кроме субботы и воскресенья. Если алгоритм может также учитывать список конкретных "исключений", которые не должны считаться рабочими днями, это будет подливать.

Спасибо заранее за предоставленный гений.

Ответ 1

Это сделает то, что вы хотите. Достаточно просто преобразовать в VB.NET, для меня было слишком долго, чтобы я мог это сделать.

DateTime start = DateTime.Now;
DateTime end = start.AddDays(9);
IEnumerable<DateTime> holidays = new DateTime[0];

// basic data
int days = (int)(end - start).TotalDays;
int weeks = days / 7;

// check for a weekend in a partial week from start.
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;

// lose the weekends
days -= weeks * 2;

foreach (DateTime dt in holidays)
{
    if (dt > start && dt < end)
        days--;
}

Ответ 2

Самый простой способ - это что-то вроде

DateTime start = new DateTime(2008, 10, 3);
DateTime end = new DateTime(2008, 12, 31);
int workingDays = 0;
while( start < end ) {
  if( start.DayOfWeek != DayOfWeek.Saturday
   && start.DayOfWeek != DayOfWeek.Sunday ) {
      workingDays++;
  }
  start = start.AddDays(1);
}

Он может быть не самым эффективным, но он позволяет легко проверять список праздников.

Ответ 3

DateDiff вместе с несколько других функций Date * уникальны для VB.NET и часто являются предметом зависти от разработчиков С#. Не уверен, что это будет очень полезно в этом случае.

Ответ 4

Вот образец формулы Стива в VB без вычитания праздника:

Function CalcBusinessDays(ByVal DStart As Date, ByVal DEnd As Date) As Decimal

        Dim Days As Decimal = DateDiff(DateInterval.Day, DStart, DEnd)
        Dim Weeks As Integer = Days / 7
        Dim BusinessDays As Decimal = Days - (Weeks * 2)
        Return BusinessDays
        Days = Nothing
        Weeks = Nothing
        BusinessDays = Nothing

End Function

Ответ 5

Вот метод для SQL Server. Там также есть метод vbscript на странице. Я не знаю, о чем вы просили.

Ответ 6

Мы объединили две статьи CodeProject, чтобы прийти к полному решению. Наша библиотека недостаточно лаконична для публикации в качестве исходного кода, но я могу указать на два проекта, которые мы использовали для достижения того, что нам нужно. Как всегда в статьях CodeProject, читайте комментарии, в них может быть важная информация.

Расчет рабочих дней: http://www.codeproject.com/KB/cs/busdatescalculation.aspx

Альтернативный рабочий день calc: http://www.codeproject.com/KB/cs/datetimelib.aspx

Расчет праздников: http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx

Ответ 7

вообще (без кода) -

  • вычесть даты, чтобы получить количество дней
  • разделите на 7, чтобы получить количество недель
  • вычесть количество недель раз 2
  • подсчитайте количество дат отпуска, которые падают с диапазоном дат
  • вычесть, что count

играйте с датами начала и окончания, чтобы они выходили в понедельник в понедельник, а затем добавляли разницу

[извинения за общие недоработки кода, это поздно]

[c.f. endDate.Subtract(StartDate).TotalDays]