一天减去一个计算营业日的方法c#

时间:2012-01-22 05:27:26

标签: .net windows c#-4.0

我一直致力于一个项目,根据添加到当前DateTime.Now的天数计算日期。我正在使用基于这项工作的几个函数:business dates calculation,因为这需要计算工作日(没有计算周末天或假期,假期被编码为app配置文件),计数需要启动在当前日期“现在”,或前一个工作日,如果开始是在周末或假日。 当前类文件始终提前在开始计数之前的下一个工作日。如果开始日期是今天,计数将在明天开始。

我的要求例如: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;

2 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分: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);
        }
    }