я действительно доволен своим кодом, но остается одна проблема.
У меня есть этот код (короткая версия):
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 днями.
Как я могу добавить дни за месяц? Например: если результат добавления дней больше дней в месяце - возьмите первый (второй, третий или любой другой) следующего месяца?! Есть ли способ или быстрое решение для этого?
Спасибо за любую помощь.
ура Дэйв
Если вы используете метод 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;
}
ПРИМЕЧАНИЕ. Вы можете привести код в скобки и улучшить логику, если хотите. Я просто хотел удержать его, чтобы было легче понять, что происходит
new DateTime
- потому что я тоже должен установить время. Это не только AddDays
- новый день должен начаться в 8 утра.
Используйте AddDays:
eskalation = eskalation.AddDays(1);
Он будет обрабатывать случаи, когда несколько месяцев для вас больше, чем другие. Это также намного чище/проще, чем то, что вы сейчас делаете.
Почему бы не сделать это простым
// isFreeDay can check for weekends, holidays, ...
while (isFreeDay(eskalation.Value.Date))
{
eskalation = eskalation.Value.AddDays(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) ;
}
eskalation = eskalation.AddDays(1);
?