0

日付パラメータに営業日(週末を除く)を追加することに関連する投稿を多数見てきましたが、そのうちのいくつかを使用してみました。ただし、一部のシナリオでは、選択したすべてのソリューションが失敗しています。以下は私が現在使用しているコードです:

private DateTime AddWorkingDays(DateTime dateValue, int noOfDays) 
    {
        // determine if we are adding or subtracting the days
        int nDirection = noOfDays < 0 ? -1 : 1;

        // move ahead the day of week
        int nWeekday = noOfDays % 5;
        while (nWeekday != 0)
        {
            dateValue = dateValue.AddDays(nDirection);
            if (dateValue.DayOfWeek != DayOfWeek.Saturday
                && dateValue.DayOfWeek != DayOfWeek.Sunday)
            {
                nWeekday -= nDirection;
            }
        }

        // move ahead the number of weeks
        int nDayweek = (noOfDays / 5) * 7;
        dateValue = dateValue.AddDays(nDayweek);

        return dateValue;
    } 

失敗するシナリオの例:日付:2012年11月24日(土曜日)、日数:5(または10)結果:2012年11月30日であった場合の2012年12月1日(または2012年12月8日)11月25日失敗、2012年も..そして私が推測する同様のシナリオでは、入力日は週末になります。

誰かがそのようなシナリオを修正するのを手伝ってもらえますか?または、より良いソリューションを提供しますか?

ありがとうございました

4

2 に答える 2

1

この実装(実際にはあなたのものと非常に似ています)は、あなたが期待する結果をもたらします:

    public static DateTime AddWorkingDays(this DateTime date, int days)
    {
        if (days == 0)
            return date;
        int sign = days < 0 ? -1 : 1;
        while (days % 5 != 0 || !date.IsWorkingDay())
        {
            date = date.AddDays(sign);
            if (!date.IsWorkingDay())
                continue;
            days -= sign;
        }
        int nWeekEnds = days / 5;
        DateTime result = date.AddDays(days + nWeekEnds * 2);
        return result;
    }

    public static bool IsWorkingDay(this DateTime date)
    {
        return !(date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday);
    }
于 2012-11-16T13:15:20.793 に答える
0

基本的に、あなたがやりたいことは、startDate残っている限り、あなたの に 1 日追加することですnoOfDays。基本的に、それが本当に意味することは、その日が週末の場合はインクリメントされない、ある種のカウンターが必要だということだけです。そのロジックを適用すると、非常に簡単になります。

    public static DateTime AddWorkingDays(DateTime startDate, int amount)
    {
        // It really is that simple!
        if (amount <= 0)
            return startDate;

        var ret = startDate;

        for (int i = 0; i < amount; )
        {
            var nextDay = ret.AddDays(1);

            // If it's saturday or sunday, just add it, but don't increment i. That way we'll
            // just keep going and virtually "skipping" the weekends.
            if (nextDay.DayOfWeek == DayOfWeek.Saturday || nextDay.DayOfWeek == DayOfWeek.Sunday)
            {
                ret = ret.AddDays(1);
                continue;
            }

            ret = ret.AddDays(1);
            i++;
        }

        return ret;
    }

基本的に、コードが行うことは、指定した開始日と追加する日数を取得することだけです。それがかかり、追加する日数がなくなるまでループします。週末の日に当たると、単純に増加せずi、事実上、その日を無視します。現在の日(営業日の場合)も総営業日数にカウントする場合は、わずかな調整が必要になる場合がありますが、それ以外は説明どおりに機能するはずです。

于 2012-11-16T13:32:56.093 に答える