Как рассчитать истекшее время на основе DateTime и дней, которые будут потрачены в C#
Я хотел бы знать, существует ли какая-либо библиотека / метод, который позволяет суммировать дни до даты без учета "дней без работы", таких как Пасха, Рождество, субботы и т. Д.
Я знаю, что существует метод DateTime.Add, но это не учитывает "нерабочие дни".
Большое спасибо!
4 ответа
Вы можете использовать структуру TimeSpan для временных интервалов. Вот пример в другом потоке stackru:
Нет, вам нужно определить свои собственные нерабочие дни и создать свою собственную функцию.
Существует метод DateTime, который сообщит вам день недели, поэтому вы можете проверить наличие сб / вс, но остальное зависит от вас. Если вы собираетесь использовать его с Office, там есть несколько библиотек, которые можно использовать. В противном случае вы, вероятно, захотите найти проект с открытым исходным кодом (их много), который сможет рассчитать это для вас.
DateTime.Now.DayOfWeek
Это будет зависеть от региона, поэтому, если вы планируете использовать свой код в более чем одной стране, это стоит учитывать. Кроме того, в США в разных штатах тоже разные праздники.
Я предполагаю, что вы хотите найти дату окончания для чего-то, учитывая дату начала и количество рабочих дней, которые это займет?
Если это так, то следующий код может быть тем, что вы хотите. Предполагается, что у вас есть список всех праздников за максимальный промежуток времени, который вы поддерживаете. Это может занять несколько лет, в зависимости от ваших требований!
Этот код принимает дату начала и количество рабочих дней (и список выходных) и возвращает дату окончания.
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;
}
Обе эти реализации страдают от посещения каждой даты. Возможно, это не проблема, но если диапазон дат большой, он может быть слишком медленным.