Я действительно доволен своим кодом, но осталась одна проблема.
У меня есть этот код (короткая версия):
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 дней.
Как я могу добавить дни за месяц? Типа - если результат добавления дней больше, чем дней в месяце - возьмите первое (второе, третье или что-то еще) следующего месяца ?! Есть ли способ или быстрое решение для этого?
Спасибо за любую помощь.
Приветствует Дэйв
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;
}
ПРИМЕЧАНИЕ . Вы можете убрать код с помощью скобок и улучшить логику, если хотите. Я просто хотел сделать его кратким, чтобы было легче понять, что происходит.
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) ;
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
eskalation = eskalation.AddDays(1);
?new DateTime
, потому что мне тоже нужно установить время. Это не толькоAddDays
- новый День тоже должен начинаться в 8 утра.