为了账号安全,请及时绑定邮箱和手机立即绑定

AddBusinessDays和GetBusinessDays

AddBusinessDays和GetBusinessDays

慕田峪4524236 2019-11-12 11:00:40
我需要找到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);}
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您的第一个功能的最新尝试:


public static DateTime AddBusinessDays(DateTime date, int days)

{

    if (days < 0)

    {

        throw new ArgumentException("days cannot be negative", "days");

    }


    if (days == 0) return date;


    if (date.DayOfWeek == DayOfWeek.Saturday)

    {

        date = date.AddDays(2);

        days -= 1;

    }

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

    {

        date = date.AddDays(1);

        days -= 1;

    }


    date = date.AddDays(days / 5 * 7);

    int extraDays = days % 5;


    if ((int)date.DayOfWeek + extraDays > 5)

    {

        extraDays += 2;

    }


    return date.AddDays(extraDays);


}

第二个函数GetBusinessDays可以实现如下:


public static int GetBusinessDays(DateTime start, DateTime end)

{

    if (start.DayOfWeek == DayOfWeek.Saturday)

    {

        start = start.AddDays(2);

    }

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

    {

        start = start.AddDays(1);

    }


    if (end.DayOfWeek == DayOfWeek.Saturday)

    {

        end = end.AddDays(-1);

    }

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

    {

        end = end.AddDays(-2);

    }


    int diff = (int)end.Subtract(start).TotalDays;


    int result = diff / 7 * 5 + diff % 7;


    if (end.DayOfWeek < start.DayOfWeek)

    {

        return result - 2;

    }

    else{

        return result;

    }

}


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 461 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信