C#:从特定日期添加工作日

标签 c# algorithm datetime

我很难做到这一点。我正在创建一种在特定日期添加工作日的方法。 例如,我想在 2010 年 9 月 15 日(星期三)增加 3 个工作日,该方法将返回 9 月 20 日(下周一)。它无视星期六和星期日,因为它是非工作日..

在 C# 中是这样的:

DateTime AddWorkingDays(DateTime specificDate, int workingDaysToAdd)
{
   return specificDate + (workingDaysToAdd - (all saturdays and sundays))
}

我在计算时不考虑特殊假期,我只是想添加除星期六和星期日以外的日子。提前致谢! =)

最佳答案

如果你不需要考虑假期,我建议你这样做:

public static DateTime AddWorkingDays(DateTime specificDate,
                                      int workingDaysToAdd)
{
    int completeWeeks = workingDaysToAdd / 5;
    DateTime date = specificDate.AddDays(completeWeeks * 7);
    workingDaysToAdd = workingDaysToAdd % 5;
    for (int i = 0; i < workingDaysToAdd; i++)
    {
        date = date.AddDays(1);
        while (!IsWeekDay(date))
        {
            date = date.AddDays(1);
        }
    }
    return date;
}

private static bool IsWeekDay(DateTime date)
{
    DayOfWeek day = date.DayOfWeek;
    return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}

效率低下,但易于理解。对于一个有效的版本,您将像以前一样计算出要添加的完整周数,然后将任何“当前星期几”和“剩下要添加的工作天数”映射到“实际 要添加的天数”。然后您可以计算出要添加的总天数,并在一次调用中完成。

编辑:就效率低下的程度而言......它真的不是非常糟糕。它只会执行最多 4 天的手动“今天是周末吗”检查,这还不错。特别是,尽管 igor(在发布时是当前的)声称,它比他的方法要快得多,尽管基准有缺陷;)

请注意,它可能还不能处理负输入——我还没有检查过。

我使用的方法背后的原因之一是它不依赖于我或代码阅读者知道 DayOfWeek 枚举中的值是什么。我不在乎它是 0-6、1-7、周一-周日、周六-周五……甚至是完全奇怪的值。我只比较相等性,这使得代码更“明显正确”。

关于C#:从特定日期添加工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717791/

相关文章:

python - 在 python 中求解 (m choose x) = n 的高效算法

python - 在 Python 中将字符串日期转换为时间戳

c# - C# 中具有固定大小数组的连续分层结构内存?

c# - 使用不同的值调用方法两次使用最小起订量进行单元测试

c# - XAML 绑定(bind)路径声明中大括号的相关性是什么

java - 如何在 java 中生成 0x00000000FFFFFFFF 长掩码?

algorithm - 两组N个人围着一圈能找到对方吗?

c# - 错误 : Native images generated against multiple versions of assembly System.Net.Http.Primitives

javascript - 无论浏览器时区如何,如何将时区设置为 'America/New_York'? (时刻.js)

python - pandas如何忽略无法转换为日期时间以计算时间增量的列单元格