2012-01-22 72 views
0

我一直在一個項目中的日期計算基於添加到當前DateTime.Now的天數。我使用了幾項基於這項工作的功能:business dates calculation,並且由於這需要計算工作日(沒有計算週末日或節假日,節假日編碼爲應用配置文件),因此計數需要在當前日期開始「現在」,或者如果開始是在週末日或假期的前一個工作日。 當前類文件始終將提前移至開始點票前的下一個工作日。如果開始日期是今天,則計數將在明天開始。天減去一種方法來計算工作日c#

我的要求,例如:2012年1月21日的開始日是星期六。增加10天的值。結果日期應該是 2月2日。這意味着開始計算的工作日是1月20日星期五+ 9天以上= 10天。另一個例子是在1月22日星期日開始,再回到1月20日,並增加9天,結果相同。提供計數不會在週末或假期開始,它應該跳過它們併到達下一個計算的工作日。

我遇到的問題是我的項目需要根據當前日期進行計算,或者如果計數開始是週末或假期,則退回上一個工作日。

我認爲班級檔案非常清晰,但我似乎找不到一種方法來強制在當前工作日開始計數,或者如果計數開始時間是週末或假期,則可以退回到上一個工作日。

請查看鏈接中的代碼。我試圖在幾個現有的方法中爲addDays參數添加負值;在我的表單中,我試圖強制dateTimePicker的值減去一天,以及整個類文件中的各種其他顛簸,導致失敗。

任何意見或幫助將不勝感激!

代碼在按鈕單擊事件:

//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(由天假日作爲整數,通過假日列表(日期時間)')這樣我可以通過節假日我想跳過功能。它看起來像你的設置,每個'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