Как добавить дни за месяц?

1

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

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

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

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

если у меня есть 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
    Не можете ли вы сделать eskalation = eskalation.AddDays(1); ?
  • 0
    Что именно вы пытаетесь достичь? Дайте больше информации о том, что / почему вы делаете это?
Показать ещё 3 комментария
Теги:
datetime

4 ответа

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

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

  • 0
    Хорошо - теперь я знаю, почему я взял new DateTime - потому что я тоже должен установить время. Это не только AddDays - новый день должен начаться в 8 утра.
  • 0
    @DaveS .: Просто установите время как единое в самом начале, затем перед циклом
Показать ещё 1 комментарий
2

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

eskalation = eskalation.AddDays(1);

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

1

Почему бы не сделать это простым

// isFreeDay can check for weekends, holidays, ...
while (isFreeDay(eskalation.Value.Date)) 
{
    eskalation = eskalation.Value.AddDays(1);
}
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) ; 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню