2013-02-20 5 views
1

Я хотел бы знать, существует ли какая-либо библиотека/метод, который позволяет суммировать дни в datetime без учета «рабочих дней», таких как Пасха, Рождество, суббота и т. Д.Как рассчитать Истекшее время на основе DateTime и дней, которые будут потрачены на C#

Я знаю, что существует метод DateTime.Add, но это не учитывало «нерабочие дни».

спасибо!

+2

Это кажется скорее специфичным для локали ... В разных странах (и даже в разных городах в некоторых случаях) проводятся различные праздничные дни. По этой причине я думаю, что маловероятно, что для него есть библиотека общего назначения. Вам нужно будет предоставить список праздников в любую библиотеку общего назначения, и если у вас есть этот список, то то, что вы хотите сделать, тривиально в любом случае. –

+0

Я работал по субботам. –

+1

Как был полезен последний комментарий? В любом случае @Ziba Leah: Для этого вы напишите свой собственный алгоритм. Мы делаем много манипуляций с датами, и я не знаю встроенного метода, который делал то, что вы делали после того, как ohters предположили, что он специфичен для локали. – Risho

ответ

3

Вы можете использовать структуру TimeSpan для временных интервалов. Вот пример на другой StackOverflow теме:

Calculate the number of business days between two dates?

MSDN Documentation for TimeSpan

+0

+1 Хорошая ссылка. Достаточно эффективен, если количество праздничных дней в списке bankHolidays слишком велико по сравнению с диапазоном дат, и в этом случае он становится немного медленнее. –

0

Нет, вы должны определить свои собственные нерабочие дни и построить свою собственную функцию.

0

Существует метод DateTime, который расскажет вам день недели, чтобы вы могли проверить Sat/Sun, но остальное зависит от вас. Если вы собираетесь использовать его в Office, там есть несколько DLL, которые можно использовать. В противном случае вы, вероятно, захотите найти проект с открытым исходным кодом (многие из них там), который может рассчитать это для вас.

DateTime.Now.DayOfWeek

Это будет очень зависит от региона, поэтому если вы планируете использовать ваш код более чем в одной стране, которая является то, чтобы рассмотреть. Кроме того, в США разные государства также имеют разные праздники.

0

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

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

Этот код принимает дату начала и количество рабочих дней (и список праздников) и возвращает дату окончания.

public static DateTime AddWorkingDays(DateTime start, int workingDays, IEnumerable<DateTime> holidays) 
{ 
    var dict = new HashSet<DateTime>(holidays); 
    DateTime date; 

    for (date = start; workingDays > 0; date = date.AddDays(1)) 
    { 
     if (!dict.Contains(date)) 
     { 
      --workingDays; 
     } 
    } 

    return date; 
} 

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

public static DateTime AddWorkingDays(DateTime start, int workingDays, Predicate<DateTime> isHoliday) 
{ 
    DateTime date; 

    for (date = start; workingDays > 0; date = date.AddDays(1)) 
    { 
     if (!isHoliday(date)) 
     { 
      --workingDays; 
     } 
    } 

    return date; 
} 

Оба этих реализаций страдают от посещения каждой даты. Возможно, это не проблема, но если диапазон дат большой, он может быть слишком медленным.