Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:从开始日期开始添加工作日_C#_Algorithm_Datetime - Fatal编程技术网

C#:从开始日期开始添加工作日

C#:从开始日期开始添加工作日,c#,algorithm,datetime,C#,Algorithm,Datetime,我做这件事有困难。我正在创建一个在特定日期添加工作日的方法。 例如,我想将3个工作日添加到2010年9月15日(星期三),该方法将返回9月20日(下周星期一)。它不考虑周六和周日,因为这是非工作日 C#中的类似内容: 我不考虑特殊假日的计算,我只是想添加除星期六和星期天以外的日子。提前感谢!=)0) { //星期六着陆加上两天 结束=结束。添加天数(2); } else if(end.DayOfWeek

我做这件事有困难。我正在创建一个在特定日期添加工作日的方法。 例如,我想将3个工作日添加到2010年9月15日(星期三),该方法将返回9月20日(下周星期一)。它不考虑周六和周日,因为这是非工作日

C#中的类似内容:


我不考虑特殊假日的计算,我只是想添加除星期六和星期天以外的日子。提前感谢!=)
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;
}
public static DateTime AddWorkingDays(DateTime specific date,
int workingDaysToAdd)
{
int completeWeeks=要添加的工作日/5;
DateTime日期=具体日期。添加天数(完成周*7);
workingDaysToAdd=workingDaysToAdd%5;
对于(int i=0;i
它效率低下,但容易理解。对于一个高效的版本,您可以像以前一样计算出要添加的完整周数,但是可以从任何“当前工作日”和“剩余添加工作日”到“实际添加天数”进行映射。然后你就可以计算出需要增加的总天数,并在一次通话中完成

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

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

我使用这种方法背后的一个原因是,它既不依赖于我,也不依赖于代码读取器知道
DayOfWeek
enum中的值是什么。我不在乎是0-6,1-7,周一周日,周六周五。。。或者即使有完全奇怪的价值观。我只比较等式,这使代码更“明显正确”。

以下是您需要的:

更新:

public static DateTime AddWeekdays(DateTime start, int days)
    {
        int remainder = days % 5;
        int weekendDays = (days / 5) * 2;

        DateTime end = start.AddDays(remainder);

        if (start.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // fix for saturday.
            end = end.AddDays(-1);
        }

        if (end.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // add two days for landing on saturday
            end = end.AddDays(2);
        }
        else if (end.DayOfWeek < start.DayOfWeek)
        {
            // add two days for rounding the weekend
            end = end.AddDays(2);
        }

        // add the remaining days
        return end.AddDays(days + weekendDays - remainder);
    }
class Program
    {

        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;
        }

        public static DateTime MyAddWorkingDays(DateTime specificDate,
                                      int workingDaysToAdd)
        {
            int foundWorkingDays = 0;
            while (foundWorkingDays < workingDaysToAdd)
            {
                specificDate = specificDate.AddDays(1);
                if (specificDate.DayOfWeek != DayOfWeek.Sunday && specificDate.DayOfWeek != DayOfWeek.Saturday)
                    foundWorkingDays++;

            }
            return specificDate;
        }


        static void Main(string[] args)
        {

            DateTime specificDate = DateTime.Now;

            Stopwatch globalTimer = Stopwatch.StartNew();
            Console.WriteLine(AddWorkingDays(specificDate, 300));  // 100000 :)
            globalTimer.Stop();
            Console.WriteLine(globalTimer.ElapsedMilliseconds);

            globalTimer = Stopwatch.StartNew();
            Console.WriteLine(MyAddWorkingDays(specificDate, 300)); // 100000 :)
            globalTimer.Stop();
            Console.WriteLine(globalTimer.ElapsedMilliseconds);



            Console.ReadLine();
        }
    }
publicstaticdatetime AddWeekdays(DateTime开始,int天)
{
整数剩余=天数%5;
国际周日=(天/5)*2;
DateTime end=start.AddDays(剩余);
如果(start.DayOfWeek==DayOfWeek.Saturday&&days>0)
{
//定在星期六。
结束=结束添加天数(-1);
}
如果(end.DayOfWeek==DayOfWeek.Saturday&&days>0)
{
//星期六着陆加上两天
结束=结束。添加天数(2);
}
else if(end.DayOfWeek
int foundWorkingDays=0;
while(查找工作日<工作日添加)
{ 
specificDate=specificDate.AddDays(1);
如果(specificDate.DayOfWeek!=DayOfWeek.Sunday和&specificDate.DayOfWeek!=DayOfWeek.周六)
foundWorkingDays++;
}
返回日期;
添加:

public static DateTime AddWeekdays(DateTime start, int days)
    {
        int remainder = days % 5;
        int weekendDays = (days / 5) * 2;

        DateTime end = start.AddDays(remainder);

        if (start.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // fix for saturday.
            end = end.AddDays(-1);
        }

        if (end.DayOfWeek == DayOfWeek.Saturday && days > 0)
        {
            // add two days for landing on saturday
            end = end.AddDays(2);
        }
        else if (end.DayOfWeek < start.DayOfWeek)
        {
            // add two days for rounding the weekend
            end = end.AddDays(2);
        }

        // add the remaining days
        return end.AddDays(days + weekendDays - remainder);
    }
class Program
    {

        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;
        }

        public static DateTime MyAddWorkingDays(DateTime specificDate,
                                      int workingDaysToAdd)
        {
            int foundWorkingDays = 0;
            while (foundWorkingDays < workingDaysToAdd)
            {
                specificDate = specificDate.AddDays(1);
                if (specificDate.DayOfWeek != DayOfWeek.Sunday && specificDate.DayOfWeek != DayOfWeek.Saturday)
                    foundWorkingDays++;

            }
            return specificDate;
        }


        static void Main(string[] args)
        {

            DateTime specificDate = DateTime.Now;

            Stopwatch globalTimer = Stopwatch.StartNew();
            Console.WriteLine(AddWorkingDays(specificDate, 300));  // 100000 :)
            globalTimer.Stop();
            Console.WriteLine(globalTimer.ElapsedMilliseconds);

            globalTimer = Stopwatch.StartNew();
            Console.WriteLine(MyAddWorkingDays(specificDate, 300)); // 100000 :)
            globalTimer.Stop();
            Console.WriteLine(globalTimer.ElapsedMilliseconds);



            Console.ReadLine();
        }
    }
类程序
{
公共静态日期时间添加工作日(日期时间指定日期,
int workingDaysToAdd)
{
int completeWeeks=要添加的工作日/5;
DateTime日期=具体日期。添加天数(完成周*7);
workingDaysToAdd=workingDaysToAdd%5;
对于(int i=0;i
一种很酷的方式(我认为)是将其放在扩展方法中,如:

public static class DateTimeExtensions
{
    public static DateTime AddWorkingDays(this DateTime self, int days)
    {
        self = self.AddDays(days);
        while (self.DayOfWeek == DayOfWeek.Saturday || self.DayOfWeek == DayOfWeek.Sunday)
        {
            self = self.AddDays(1);
        }

        return self;
    }
}
因此,您的最终代码如下所示:

specificDate.AddWorkingDays(3);

这是一个老帖子,但有人可能对处理负面日子的扩展感兴趣。(我已经修改了@Jon answer)

publicstaticdatetime AddWeekDays(此DateTime开始,int天)
{
int方向=数学符号(天);
完整周数=天/5;
剩余整数=天数%5;
DateTime end=start.AddDays(completeWeeks*7);
对于(int i=0;i<剩余*方向;i++)
{
    public static DateTime AddWeekDays(this DateTime start, int days)
    {
        int direction = Math.Sign(days);

        int completeWeeks = days / 5;
        int remaining = days % 5;

        DateTime end = start.AddDays(completeWeeks * 7);

        for (int i = 0; i < remaining * direction; i++)
        {
            end = end.AddDays(direction * 1);
            while (!IsWeekDay(end))
            {
                end = end.AddDays(direction * 1);
            }
        }
        return end;
    }

    private static bool IsWeekDay(DateTime date)
    {
        DayOfWeek day = date.DayOfWeek;
        return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
    }
public static DateTime AddWorkingDays(DateTime date, int daysToAdd)
{
    while (daysToAdd > 0)
    {
        date = date.AddDays(1);

        if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday) daysToAdd -= 1;
    }

    return date;
}