.net 计算营业日c的日减一法#

.net 计算营业日c的日减一法#,.net,windows,c#-4.0,.net,Windows,C# 4.0,我一直在做一个项目,在这个项目中,日期是根据当前DateTime.Now中添加的天数来计算的。我在这项工作的基础上使用了几个函数:,因为这需要计算工作日(没有计算周末或假日,假日被编码到应用程序配置文件),所以计数需要从当前日期“现在”开始,如果开始是在周末或假日,则从上一个工作日开始。在开始计数之前,当前类文件总是提前到下一个工作日。如果开始日期是今天,则计数将从明天开始 我的要求例如:2012年1月21日的开始日是星期六。将添加10天的值。最终日期应为2月2日。这意味着开始计算的工作日为1月

我一直在做一个项目,在这个项目中,日期是根据当前DateTime.Now中添加的天数来计算的。我在这项工作的基础上使用了几个函数:,因为这需要计算工作日(没有计算周末或假日,假日被编码到应用程序配置文件),所以计数需要从当前日期“现在”开始,如果开始是在周末或假日,则从上一个工作日开始。在开始计数之前,当前类文件总是提前到下一个工作日。如果开始日期是今天,则计数将从明天开始

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

你看过你链接到的那篇文章了吗

它包含用于计算上一个工作日的以下代码段:

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();
   }
}
它还包含一种强制日期为工作日的方法,用于选择下一个工作日:

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
方法。

对下面方法的修改会导致从所选日期而不是下一个业务日期开始计数。这就解决了问题。谢谢大家的评论

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);
        }
    }
public void AddBusinessDays(短天数)
{
双符号=Convert.ToDouble(数学符号(天));
int unsignedDays=Math.Sign(days)*days-1;//*days;添加-1以强制计数从所选日期开始,而不是从下一个工作日开始。
对于(int i=0;i
您能更简洁地说明您的问题是什么吗?我也遇到过类似的问题,但我选择创建一个名为
AddWorkDays(byVal days为整数,byVal Holidays为列表(日期时间))
的函数,这样我就可以传递我想跳到该函数的假期。这看起来像是你的设置方式,每个
XDateTime
都存储自己的假期。请在此处发布一些代码,说明你尝试的方法给你带来了麻烦。在原始问题中添加了按钮单击事件。抱歉,我不确定如何将格式化代码放入注释中。我需要做的是开始计数的日期是日期时间选择器的日期,而不是下一个工作日。谢谢你好,谢谢你的评论。是的,我读过这篇文章。也许我做了一些不正确的事情,但是前一个工作日的方法没有像预期的那样返回到前一个工作日-我不知道为什么。在这种情况下,周末和节假日的工作方式是将-1分配给下一个工作日方法。我不希望从上一个工作日(或下一个工作日)开始计算,而是应该在指定的日期开始计算。对于我刚才的评论,我发现,如果开始日在周六,则下一个工作日的-1值有效,如果在周日,则移动到周一开始计算。如果选择的开始日期是周六、周日或假日,则计数应始终在前一个工作日开始。否则,计数中应完全跳过天数。