Сравнение дат в .NET: Подсчитать количество рабочих дней с даты? - PullRequest
11 голосов
/ 03 октября 2008

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

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

Заранее благодарим за вклад гения.

Ответы [ 7 ]

16 голосов
/ 03 октября 2008

Это будет делать то, что вы хотите. Это должно быть достаточно легко, чтобы конвертировать в 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--;
}
13 голосов
/ 03 октября 2008

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

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

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

4 голосов
/ 02 августа 2011

Вот пример формулы Стива в 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
3 голосов
/ 03 октября 2008

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

2 голосов
/ 03 октября 2008

в целом (без кода) -

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

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

[извиняюсь за отсутствие кодовых общностей, уже поздно]

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

1 голос
/ 03 октября 2008

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

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

Расчет альтернативного рабочего дня: http://www.codeproject.com/KB/cs/datetimelib.aspx

Расчет выходных дней: http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx

1 голос
/ 03 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...