2012-01-22 16 views
0

私は現在のDateTime.Nowに追加された日数に基づいて日付が計算されるプロジェクトに取り組んでいます。私はこの仕事に基づいていくつかの機能を使用しています:business dates calculationこれは営業日の計算を必要とするため(週末や休日は計算されず、休日はアプリケーション設定ファイルにコード化されます)、カウントは現在の日付「今」、または開始日が週末の日または休日の場合は前の営業日です。 現在のクラスファイルは、を先にに移動してカウントを開始する翌営業日になります。開始日が今日の場合、カウントは明日から開始されます。日から営業日を計算する1つの方法C#

私の要件:たとえば、1月21日の開始日は土曜日です。 10日分の値が追加されます。結果の日付 2月2日である必要があります。これは、計算を開始する営業日が1月20日金+ 9日以上= 10日であることを意味します。もう1つの例は、1月22日の日曜日に開始日を設定し、1月20日に戻って同じ結果を9日追加することです。週末または休日にカウントが開始されない場合は、カウントをスキップして次の計算された営業日に到着する必要があります。

問題は、私のプロジェクトが現在の日付に基づいて計算する必要があるか、またはカウント開始が週末または休日の場合は前の営業日に戻る必要があるという問題です。

私はクラスファイルは非常にはっきりしていると思いますが、現在の営業日にカウントを開始する方法を見つけたり、カウントの開始が週末や休日の場合は前の営業日に戻ったりします。

リンクのコードをご覧ください。私はいくつかの既存のメソッドでaddDaysパラメータに負の値を追加しようとしました。私のフォームでは、dayTimePickerの値を強制的に取り除こうとしましたが、クラスファイル全体でさまざまなさまざまなスラッシングが発生し、結果として失敗しました。

ご迷惑をおかけして申し訳ございません。ボタンのクリックイベントで

コード:

//DateTime.Today.AddDays(-4); 

     DateTime date = dateTimePicker1.Value; 
     // dateTimePicker1.Value.AddDays(-2); 
     XDateTime sDate = new XDateTime(dateTimePicker1.Value.ToShortDateString(), XDateTimeType.Business); 

     string Str = textBox2.Text.Trim(); 
     string Str2 = textBox3.Text.Trim(); 

     double Num; 
     bool isNum = double.TryParse(Str, out Num); 
     bool isNum2 = double.TryParse(Str2, out Num); 
     label6.Text = ""; 

     //Test whether textBox contains a number or some other character. Fails if not a number. 
     if (isNum) 
     { 
      short days = Convert.ToInt16(textBox2.Text); 
      sDate.AddBusinessDays(days); 

      lblTodaysDate.Text = " Substantial Completion Date: " + sDate.Date.ToString("MMMM d, yyyy"); 
      label3.Text = ""; 

      if (isNum2) 
      { 
       short days2 = Convert.ToInt16(textBox3.Text); 
       sDate.AddBusinessDays(days2); 
       label6.Text = " Physical Completion Date: " + sDate.Date.ToString("MMMM d, yyyy"); 
       label5.Text = ""; 
      } 
      else 
       label5.Text = "Please enter numbers only!";    
      return; 
     } 
     else 
      label3.Text = "Please enter numbers only!"; 
     return; 
+0

あなたの質問が少し簡潔になりますか?私は同様の問題を抱えていましたが、 'AddWorkDays(ByVal days as Integer、ByVal Holidays from List(DateTime)) 'という関数を作成しました。この方法で、私は関数にスキップしたい休暇を渡すことができます。あなたの設定と同じように見えます。それぞれの 'XDateTime'は独自の休日を格納しています。 – Origin

+0

ここにあなたの問題を起こしている方法へのあなたの試みを示すいくつかのコードを投稿してください。 –

+0

ボタンのクリックイベントを元の質問に追加しました。申し訳ありませんが、書式設定されたコードをコメントに配置する方法がわかりません。私は何が起こる必要があるのか​​は、日のピッカーからの翌営業日ではなく、翌営業日の日付であることを日が開始することです。ありがとう! – gary7

答えて

0

以下の方法を変更すると、次の営業ではなく、選択された日からカウントが開始されます。これにより問題が解決されます。誰もコメントしてくれてありがとう!

public void AddBusinessDays(short days) 
    { 
     double sign = Convert.ToDouble(Math.Sign(days)); 
     int unsignedDays = Math.Sign(days) * days -1; //*days; added -1 to force count to start on selected day, rather than next business day. 
     for (int i = 0; i < unsignedDays; i++) 
     { 
      do 
      { 
       _date = _date.AddDays(sign); 
      } 
      while (!this.IsWorkDay); 
     } 
    } 
2

あなたがにリンクの記事を読みましたか?

それは前営業日計算するための次のコードが含まれています

do 
{ 
    date = date.AddDays(-1.0); 
} 
while (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday || 
    _holidays.ContainsValue(date.ToString(_format))); 

また、翌営業日選ぶ営業日に日付を強制するための方法であって、含まれています

private void check() 
{ 
    if (_type == XDateTimeType.Business && !this.IsWorkDay) 
    { 
     _date = this.NextBusinessDay(); 
    } 
} 

前日から一貫して開始したい場合はcheckメソッドをPreviousBusinessDayに変更してください。または、類似の方法を作成するcheckPreviousメソッド。

+0

こんにちは、ありがとうコメント。はい、私は記事を読んだ。おそらく私は間違って何かをしているかもしれませんが、前営業日の方法は、予想通り前の営業日に戻っていません。理由はわかりません。この状況で週末や休日に何ができるのかは、翌営業日のメソッドに-1を割り当てることです。前営業日(または次回)から一貫して開始したくないのではなく、割り当て日にカウントを開始する必要があります。 – gary7

+0

そして、私が今作成したコメントについては、日曜日に土曜日に来ると、日曜日に次の営業日に-1が表示され、日曜日に月曜日にカウントを開始すると動作することがわかりました。選択された開始日が土曜日、日曜日、または休日の場合は、前の営業日にカウントが開始されます。さもなければ日数はすべてカウントでスキップされるべきです。 – gary7

関連する問題