如何在一个月内添加天数?

时间:2014-07-16 11:02:29

标签: c# datetime

我对我的代码非常满意,但还有一个问题。

我有这个代码(简短版):

if (holidays.Contains(eskalation.Value.Date))
{
    eskalationsZeit = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 1, 8, 0, 0);
    if (eskalation.Value.Day == DateTime.DaysInMonth(eskalation.Value.Year, eskalation.Value.Month))
    {
        eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 1, 8, 0, 0);

        if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
        {
              eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 3, 8, 0, 0);
              }
              else if (eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
              {
                  eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 2, 8, 0, 0);
              }
        }
}

在本规范中,我要问的是节假日(列表),星期六或星期日,如果是月份的最后一天,那么我必须更改月份。 一切都很好但是 -

如果我有30天的一个月的第28个,这是一个假期,我将增加1天,所以我是第29个。现在29日是星期六,所以我将再添加2天,但此时我得到了我的例外,因为我添加了这样的日子:

if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
{
    eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 2, 8, 0, 0);
}

结果将是一个月的第31天,只有30天。

如何在一个月内添加天数?喜欢 - 如果添加Days的结果大于每月的天数 - 请选择下个月的第一个(第二个,第三个或其他什么)?!是否有方法或快​​速解决方案?

感谢您的帮助。

欢呼戴夫

4 个答案:

答案 0 :(得分:3)

如果您使用AddDays()方法,它会在发生溢出时自动为您处理月份和年份的更改...

eskalation = eskalation.AddDays(numOfDays);

考虑到这一点,我相信以下代码将满足您的需求:

// Keep looping until we find a date that we like
while(true)
{
    if(holidays.Contains(eskalation.Value.Date))
        eskalation = eskalation.AddDays(1);
    else if(eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
        eskalation = eskalation.AddDays(2);
    else if(eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
        eskalation = eskalation.AddDays(1);
    else
        break;
}

注意:您可以使用括号整理代码,并根据需要改进逻辑。我只想保持简短,以便更容易理解正在发生的事情

答案 1 :(得分:2)

使用AddDays

eskalation = eskalation.AddDays(1);

它会处理几个月比其他人长的实例。它比你现在做的更干净/更容易。

答案 2 :(得分:1)

为什么不简单

// isFreeDay can check for weekends, holidays, ...
while (isFreeDay(eskalation.Value.Date)) 
{
    eskalation = eskalation.Value.AddDays(1);
}

答案 3 :(得分:1)

而不是这样做:

if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
{
    eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 2, 8, 0, 0);
}

这样做:

while (eskalation.Value.DayOfWeek == DayOfWeek.Saturday || eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
{
    eskalation = eskalation.AddDays(1) ; 
}