Как рассчитать истекшее время на основе DateTime и дней, которые будут потрачены в C#

Я хотел бы знать, существует ли какая-либо библиотека / метод, который позволяет суммировать дни до даты без учета "дней без работы", таких как Пасха, Рождество, субботы и т. Д.

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

Большое спасибо!

4 ответа

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

Рассчитать количество рабочих дней между двумя датами?

Документация MSDN для TimeSpan

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

Существует метод 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;
}

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

Другие вопросы по тегам