【问题标题】:day minus one method to calculate business day c#天减去一种计算工作日的方法c#
【发布时间】:2012-01-22 05:27:26
【问题描述】:

我一直在从事一个项目,该项目的日期是根据添加到当前 DateTime.Now 的天数来计算的。我正在使用基于这项工作的几个功能:business dates calculation,并且由于这需要计算工作日(不计算周末或节假日,节假日被编码到应用程序配置文件中),计数需要从当前日期“现在”,如果开始是在周末或节假日,则为前一个工作日。 current 类文件总是在开始计数之前将 ahead 移到下一个工作日。如果开始日期是今天,则计数将从明天开始。

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

【问题讨论】:

  • 您的问题能再简洁一点吗?我遇到了类似的问题,但我选择创建一个名为AddWorkDays(byVal days as Integer, byVal Holidays as List(of DateTime)) 的函数,这样我可以通过我想跳到函数的假期。看起来就像您的设置方式一样,每个XDateTime 都存储自己的假期。
  • 请在此处发布一些代码,显示您对给您带来麻烦的方法的尝试。
  • 将按钮点击事件添加到原始问题中。抱歉,我不确定如何将格式化代码放入 cmets。我需要做的是开始计数的日期是日期时间选择器的日期,而不是下一个工作日。谢谢!

标签: .net windows c#-4.0


【解决方案1】:

您是否阅读了您链接到的文章?

它包含以下用于计算前一个工作日的sn-p:

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 分配给 Next Business Day 方法。我不想从前一个工作日(或下一个工作日)开始,而是应该从指定的日期开始计数。
  • 对于我刚刚发表的评论,我发现如果开始日在星期六,则在下一个工作日设置 -1 有效,如果在星期日则移动到星期一开始计数。如果选择的开始日期是星期六、星期日或节假日,则计数应始终从前一个工作日开始。否则,应该在计数中完全跳过这些天数。
【解决方案2】:

对以下方法的修改导致从所选日期开始计数,而不是从下一个业务开始。这解决了这个问题。感谢所有评论的人!

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);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多