添加工作日和GetBusinessDays [英] Add Business Days and GetBusinessDays

查看:163
本文介绍了添加工作日和GetBusinessDays的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 公共静态的DateTime AddBusinessDays(这个日期时间日期,INT天)
{
 // code在这里
}

和

公共静态INT GetBusinessDays(这个日期开始,日期时间结束)
{
 // code在这里
}
 

O(1)preferable(无环路)。

编辑:  通过工作日我的意思是工作日(周一,周二,周三,周四,周五)。无节假日,只是周末除外。

我已经有一些丑陋的解决方案,似乎工作,但我不知道是否有优雅的方式来做到这一点。谢谢


这就是我写这么远。它的工作原理在所有情况下,并不会否定了。 还需要一个GetBusinessDays实施

 公共静态的DateTime AddBusinessDays(这个日期的startDate,
                                         INT businessDays)
{
    INT方向= Math.Sign(businessDays);
    如果(方向== 1)
    {
        如果(startDate.DayOfWeek == DayOfWeek.Saturday)
        {
            的startDate = startDate.AddDays(2);
            businessDays = businessDays  -  1;
        }
        否则,如果(startDate.DayOfWeek == DayOfWeek.Sunday)
        {
            的startDate = startDate.AddDays(1);
            businessDays = businessDays  -  1;
        }
    }
    其他
    {
        如果(startDate.DayOfWeek == DayOfWeek.Saturday)
        {
            的startDate = startDate.AddDays(-1);
            businessDays = businessDays + 1;
        }
        否则,如果(startDate.DayOfWeek == DayOfWeek.Sunday)
        {
            的startDate = startDate.AddDays(-2);
            businessDays = businessDays + 1;
        }
    }

    INT initialDayOfWeek = Convert.ToInt32(startDate.DayOfWeek);

    INT weeksBase = Math.Abs​​(businessDays / 5);
    INT addDays = Math.Abs​​(businessDays%5);

    如果((方向== 1&安培;&安培; addDays + initialDayOfWeek→5)||
         (方向== -1放大器;&安培; addDays> = initialDayOfWeek))
    {
        addDays + = 2;
    }

    INT totalDays =(weeksBase * 7)+ addDays;
    返回startDate.AddDays(totalDays *方向);
}
 

解决方案

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

 公共静态的DateTime AddBusinessDays(日期时间日期,INT天)
{
    如果(天℃,)
    {
        抛出新的ArgumentException(天不能为负,天);
    }

    如果(天== 0)返回日期;

    如果(date.DayOfWeek == DayOfWeek.Saturday)
    {
        日期= date.AddDays(2);
        天 -  = 1;
    }
    否则,如果(date.DayOfWeek == DayOfWeek.Sunday)
    {
        日期= date.AddDays(1);
        天 -  = 1;
    }

    日期= date.AddDays(天/ 5 * 7);
    INT extraDays =天数5%;

    如果((int)的date.DayOfWeek + extraDays→5)
    {
        extraDays + = 2;
    }

    返回date.AddDays(extraDays);

}
 

的第二个功能,GetBusinessDays,可以如下实施:

 公共静态INT GetBusinessDays(DateTime的开始,结束日期时间)
{
    如果(start.DayOfWeek == DayOfWeek.Saturday)
    {
        开始= start.AddDays(2);
    }
    否则,如果(start.DayOfWeek == DayOfWeek.Sunday)
    {
        开始= start.AddDays(1);
    }

    如果(end.DayOfWeek == DayOfWeek.Saturday)
    {
        结束= end.AddDays(-1);
    }
    否则,如果(end.DayOfWeek == DayOfWeek.Sunday)
    {
        结束= end.AddDays(-2);
    }

    INT差异=(int)的end.Subtract(开始).TotalDays;

    INT结果=差异/ 7 * 5 + DIFF%7;

    如果(end.DayOfWeek< start.DayOfWeek)
    {
        返回结果 -  2;
    }
    其他{
        返回结果;
    }
}
 

I need to find 2 elegant complete implementations of

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) preferable (no loops).

EDIT: By business days i mean working days (Monday, Tuesday, Wednesday, Thursday, Friday). No holidays, just weekends excluded.

I already have some ugly solutions that seem to work but i wonder if there are elegant ways to do this. Thanks


This is what i've written so far. It works in all cases and does negatives too. Still need a GetBusinessDays implementation

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 = Convert.ToInt32(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);
}

解决方案

Latest attempt for your first function:

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

}

The second function, GetBusinessDays, can be implemented as follows:

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

这篇关于添加工作日和GetBusinessDays的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆