Я действительно доволен своим кодом, но осталась одна проблема.

У меня есть этот код (короткая версия):

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

В этом коде я спрашиваю, является ли день праздником (список), субботой или воскресеньем, и если это последний день месяца, поэтому мне нужно изменить месяц. Все работает нормально НО -

Если у меня 28-е число месяца с 30 днями, и это выходной, я добавлю 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 дней.

Как я могу добавить дни за месяц? Типа - если результат добавления дней больше, чем дней в месяце - возьмите первое (второе, третье или что-то еще) следующего месяца ?! Есть ли способ или быстрое решение для этого?

Спасибо за любую помощь.

Приветствует Дэйв

1
Dave Stockinger 16 Июл 2014 в 15:02
1
Ты не можешь сделать eskalation = eskalation.AddDays(1);?
 – 
Nikhil Agrawal
16 Июл 2014 в 15:04
Чего именно вы пытаетесь достичь? Дайте больше информации о том, что / почему вы делаете это?
 – 
Louis van Tonder
16 Июл 2014 в 15:05
Это приложение для создания отчетов — мне нужно рассчитать даты эскалации отправленных заявок. Дата эскалации никогда не бывает праздником или выходным, поэтому я должен получить дату из своей БД, а затем вычислить, не является ли это праздником или выходным днем.
 – 
Dave Stockinger
16 Июл 2014 в 15:19
Если это праздничный или выходной день, я должен добавить дни до следующего "рабочего дня" (понедельник - пятница)
 – 
Dave Stockinger
16 Июл 2014 в 15:20
ОК, теперь я знаю, почему взял new DateTime, потому что мне тоже нужно установить время. Это не только AddDays - новый День тоже должен начинаться в 8 утра.
 – 
Dave Stockinger
16 Июл 2014 в 15:41

4 ответа

Лучший ответ

Если вы используете 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;
}

ПРИМЕЧАНИЕ . Вы можете убрать код с помощью скобок и улучшить логику, если хотите. Я просто хотел сделать его кратким, чтобы было легче понять, что происходит.

5
musefan 16 Июл 2014 в 15:12
ОК, теперь я знаю, почему я взял new DateTime, потому что мне тоже нужно установить время. Это не только AddDays - новый день тоже должен начинаться в 8 утра.
 – 
Dave Stockinger
16 Июл 2014 в 15:39
@DaveS.: Просто установите время как одно в самом начале, перед циклом
 – 
musefan
16 Июл 2014 в 15:50
Сделал это в возврате! Все отлично и работает блестяще! Спасибо за помощь.
 – 
Dave Stockinger
16 Июл 2014 в 17:14

Используйте AddDays:

eskalation = eskalation.AddDays(1);

Он справится с ситуациями, когда одни месяцы для вас длиннее других. Это также намного чище / проще, чем то, что вы делаете сейчас.

1
DGibbs 16 Июл 2014 в 15:05

Почему бы не упростить

// isFreeDay can check for weekends, holidays, ...
while (isFreeDay(eskalation.Value.Date)) 
{
    eskalation = eskalation.Value.AddDays(1);
}
1
peter 16 Июл 2014 в 15:06

Вместо этого:

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) ; 
}
1
Perfect28 16 Июл 2014 в 15:11