4

私のシステムでは、請求書の期日は発行日から14日後でなければなりません。
期日があり、発行日を知りたいのですが。
私は計算する必要があります:

issued date = 14 days prior to the due date

ただし、 14日は休日ではなく、営業日である必要があります。
休日は次のようにテーブル「tblHolidayMaster」に保存されます。

日付説明
2012/05/13母の日
2012/06/02土曜日
2012/12/25クリスマス

休日を避けて発行日を計算するにはどうすればよいですか?
皆様のご関心とご返信ありがとうございました。

4

5 に答える 5

3

以下のような関数を使用して日付を計算します(私はこれを使用します)

public static DateTime AddBusinessDays(DateTime date, int 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;
 }

int extraDaysForHolidays =-1;
//Load holidays from DB into list
List<DateTime> dates = GetHolidays();

while(extraDaysForHolidays !=0)
{

 var days =  dates.Where(x => x >= date  && x <= date.AddDays(extraDays)).Count;
 extraDaysForHolidays =days;
 extraDays+=days;  
}


return date.AddDays(extraDays);

}

休日を行うastセクションをテストしていません

于 2012-06-07T10:20:09.960 に答える
2

私は単純なループソリューションを使用したので、長い間隔では遅くなります。しかし、14日間のような短い間隔では、かなり高速になるはずです。

コンストラクターで休日を渡す必要があります。のインスタンスBusinessDaysは不変であり、再利用できます。実際には、おそらくIoCシングルトンまたは同様の構造を使用して取得します。

AddBusinessDaysArgumentException開始日が営業日以外の場合は、そのケースの処理方法を指定しなかったため、をスローします。特にAddBusinessDays(0)営業日以外の日には、奇妙な特性があります。時間反転の対称性を破るか、営業日以外の日を返します。

public class BusinessDays
{
    private HashSet<DateTime> holidaySet;
    public ReadOnlyCollection<DayOfWeek> WeekendDays{get; private set;}

    public BusinessDays(IEnumerable<DateTime> holidays, IEnumerable<DayOfWeek> weekendDays)
    {
        WeekendDays = new ReadOnlyCollection<DayOfWeek>(weekendDays.Distinct().OrderBy(x=>x).ToArray());
        if(holidays.Any(d => d != d.Date))
            throw new ArgumentException("holidays", "A date must have time set to midnight");
        holidaySet = new HashSet<DateTime>(holidays);
    }

    public BusinessDays(IEnumerable<DateTime> holidays)
        :this(holidays, new[]{DayOfWeek.Saturday, DayOfWeek.Sunday})
    {
    }

    public bool IsWeekend(DayOfWeek dayOfWeek)
    {
        return WeekendDays.Contains(dayOfWeek);
    }

    public bool IsWeekend(DateTime date)
    {
        return IsWeekend(date.DayOfWeek);
    }

    public bool IsHoliday(DateTime date)
    {
        return holidaySet.Contains(date.Date);
    }

    public bool IsBusinessDay(DateTime date)
    {
        return !IsWeekend(date) && !IsHoliday(date);
    }

    public DateTime AddBusinessDays(DateTime date, int days)
    {
        if(!IsBusinessDay(date))
            throw new ArgumentException("date", "date bust be a business day");
        int sign = Math.Sign(days);
        while(days != 0)
        {
            do
            {
              date.AddDays(sign);
            } while(!IsBusinessDay(date));
            days -= sign;
        }
        return date;
    }
}
于 2012-06-07T11:12:37.217 に答える
1

それがあなたが必要としていたことだと思います。それは単純で、私はそれをテストし、それは機能しています...そして、C#で複雑なコードを書くのではなく、データベースに関数またはSPを書くことは悪いアプローチではありません...(日付の列名をあなたのように変更してくださいdb。)

必要に応じて機能またはSPにします。

注:「土曜日」と「日曜日」のチェックにコメントを付けてください。テーブルにすでに追加されている場合は、reocrdsします。

declare @NextWorkingDate datetime
declare @CurrentDate datetime
set @CurrentDate = GETDATE()
set @NextWorkingDate = @CurrentDate 
declare @i int = 0
While(@i < 14)
Begin
    if(((select COUNT(*) from dbo.tblHolidayMaster where convert(varchar(10),[Date],101) like convert(varchar(10),@NextWorkingDate,101)) > 0) OR DATENAME(WEEKDAY,@NextWorkingDate) = 'Saturday' OR DATENAME(WEEKDAY,@NextWorkingDate) = 'Sunday')
    Begin
        print 'a '  
        print @NextWorkingDate
        set @NextWorkingDate = @NextWorkingDate + 1
        CONTINUE
    End
    else
    Begin
        print  'b ' 
        print @NextWorkingDate
        set @NextWorkingDate = @NextWorkingDate + 1
        set @i = @i + 1
        CONTINUE
    End
End
print @NextWorkingDate 
于 2012-06-07T11:26:20.783 に答える
1

私はあなたのテーブル'tblHolidayMaster'からのみあなたの休日を避けて発行日を計算します。

 int addDay = -14;
  DateTime dtInputDay = System.DateTime.Now;//Your input day
  DateTime dtResultDate = new DateTime();
  dtResultDate = dtInputDay.AddDays(addDay);
  bool result = false;
  string strExpression;
  DataView haveHoliday;
  while (!result) {
      strExpression = "Date >='" + Convert.ToDateTime(dtResultDate.ToString("yyyy/MM/dd")) + "' and Date <='" + Convert.ToDateTime(dtInputDay.ToString("yyyy/MM/dd")) + "'";
      haveHoliday = new DataView(tblHolidayMaster);
      haveHoliday.RowFilter = strExpression;
      if (haveHoliday.Count == 0) {          
        result = true;
      } else {
          addDay = -(haveHoliday.Count);
          dtInputDay = dtResultDate.AddDays(-1);
          dtResultDate = dtResultDate.AddDays(addDay);
      }
  }                      

発行日はdtResultDateです

于 2012-06-08T03:47:30.880 に答える
0

次のリンクを試してください、

http://www.c-sharpcorner.com/uploadfile/tirthacs/difference-between-two-dates-except-weekends/

于 2012-06-07T10:05:00.410 に答える