Как я уже упоминал в комментариях, есть несколько вещей, которые вы можете подразумевать под «следующим вторником», но этот код дает вам «следующий вторник или сегодня, если уже вторник»:
DateTime today = DateTime.Today;
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) today.DayOfWeek + 7) % 7;
DateTime nextTuesday = today.AddDays(daysUntilTuesday);
Если вы хотите указать «недельное время», если уже вторник, вы можете использовать:
// This finds the next Monday (or today if it's Monday) and then adds a day... so the
// result is in the range [1-7]
int daysUntilTuesday = (((int) DayOfWeek.Monday - (int) today.DayOfWeek + 7) % 7) + 1;
... или вы можете использовать оригинальную формулу, но с завтрашнего дня:
DateTime tomorrow = DateTime.Today.AddDays(1);
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) tomorrow.DayOfWeek + 7) % 7;
DateTime nextTuesday = tomorrow.AddDays(daysUntilTuesday);
РЕДАКТИРОВАТЬ: Просто, чтобы сделать это красиво и универсально:
public static DateTime GetNextWeekday(DateTime start, DayOfWeek day)
{
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysToAdd = ((int) day - (int) start.DayOfWeek + 7) % 7;
return start.AddDays(daysToAdd);
}
Таким образом, чтобы получить значение для «сегодня или в ближайшие 6 дней»:
DateTime nextTuesday = GetNextWeekday(DateTime.Today, DayOfWeek.Tuesday);
Чтобы получить значение для «следующий вторник, исключая сегодня»:
DateTime nextTuesday = GetNextWeekday(DateTime.Today.AddDays(1), DayOfWeek.Tuesday);