.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]