AddBusinessDays和GetBusinessDays

我需要找到2个优雅的完整实现


public static DateTime AddBusinessDays(this DateTime date, int days)

{

 // code here

}


and 


public static int GetBusinessDays(this DateTime start, DateTime end)

{

 // code here

}

最好是O(1)(无循环)。


编辑:工作日是指工作日(星期一,星期二,星期三,星期四,星期五)。没有假期,只有周末除外。


我已经有了一些看起来可行的丑陋解决方案,但是我想知道是否有优雅的方法可以做到这一点。谢谢


这是我到目前为止所写的。它在所有情况下均有效,并且也具有负面效果。仍然需要GetBusinessDays实施


public static DateTime AddBusinessDays(this DateTime startDate,

                                         int businessDays)

{

    int direction = Math.Sign(businessDays);

    if(direction == 1)

    {

        if(startDate.DayOfWeek == DayOfWeek.Saturday)

        {

            startDate = startDate.AddDays(2);

            businessDays = businessDays - 1;

        }

        else if(startDate.DayOfWeek == DayOfWeek.Sunday)

        {

            startDate = startDate.AddDays(1);

            businessDays = businessDays - 1;

        }

    }

    else

    {

        if(startDate.DayOfWeek == DayOfWeek.Saturday)

        {

            startDate = startDate.AddDays(-1);

            businessDays = businessDays + 1;

        }

        else if(startDate.DayOfWeek == DayOfWeek.Sunday)

        {

            startDate = startDate.AddDays(-2);

            businessDays = businessDays + 1;

        }

    }


    int initialDayOfWeek = (int)startDate.DayOfWeek;


    int weeksBase = Math.Abs(businessDays / 5);

    int addDays = Math.Abs(businessDays % 5);


    if((direction == 1 && addDays + initialDayOfWeek > 5) ||

         (direction == -1 && addDays >= initialDayOfWeek))

    {

        addDays += 2;

    }


    int totalDays = (weeksBase * 7) + addDays;

    return startDate.AddDays(totalDays * direction);

}


慕田峪4524236
浏览 465回答 3
3回答

莫回无

您的第一个功能的最新尝试:public static DateTime AddBusinessDays(DateTime date, int days){&nbsp; &nbsp; if (days < 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; throw new ArgumentException("days cannot be negative", "days");&nbsp; &nbsp; }&nbsp; &nbsp; if (days == 0) return date;&nbsp; &nbsp; if (date.DayOfWeek == DayOfWeek.Saturday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; date = date.AddDays(2);&nbsp; &nbsp; &nbsp; &nbsp; days -= 1;&nbsp; &nbsp; }&nbsp; &nbsp; else if (date.DayOfWeek == DayOfWeek.Sunday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; date = date.AddDays(1);&nbsp; &nbsp; &nbsp; &nbsp; days -= 1;&nbsp; &nbsp; }&nbsp; &nbsp; date = date.AddDays(days / 5 * 7);&nbsp; &nbsp; int extraDays = days % 5;&nbsp; &nbsp; if ((int)date.DayOfWeek + extraDays > 5)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; extraDays += 2;&nbsp; &nbsp; }&nbsp; &nbsp; return date.AddDays(extraDays);}第二个函数GetBusinessDays可以实现如下:public static int GetBusinessDays(DateTime start, DateTime end){&nbsp; &nbsp; if (start.DayOfWeek == DayOfWeek.Saturday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; start = start.AddDays(2);&nbsp; &nbsp; }&nbsp; &nbsp; else if (start.DayOfWeek == DayOfWeek.Sunday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; start = start.AddDays(1);&nbsp; &nbsp; }&nbsp; &nbsp; if (end.DayOfWeek == DayOfWeek.Saturday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; end = end.AddDays(-1);&nbsp; &nbsp; }&nbsp; &nbsp; else if (end.DayOfWeek == DayOfWeek.Sunday)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; end = end.AddDays(-2);&nbsp; &nbsp; }&nbsp; &nbsp; int diff = (int)end.Subtract(start).TotalDays;&nbsp; &nbsp; int result = diff / 7 * 5 + diff % 7;&nbsp; &nbsp; if (end.DayOfWeek < start.DayOfWeek)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return result - 2;&nbsp; &nbsp; }&nbsp; &nbsp; else{&nbsp; &nbsp; &nbsp; &nbsp; return result;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP