Немного арифметики должно спасти день (каламбур):
var start = new DateTime(2012, 1, 1);
var end = new DateTime(2012, 10, 1);
var interval = 2; // days
var today = DateTime.Today;
var diff = (int)((today - start).TotalDays);
var mod = diff % interval;
var correction = TimeSpan.FromDays((mod > interval / 2 ? interval : 0) - mod);
var result = today + correction > end ? today : today + correction;
Console.Out.WriteLine("Result is: {0}", result);
увидеть это в действии .
Что это делаетэто вычислить, сколько дней от «места повторения» сегодня (переменная mod
).Это, очевидно, будет число> = 0 и <интервал.Если он составляет половину интервала или меньше, это означает, что ближайшая точка повторения находится раньше, чем сегодня, и в этом случае вычтите <code>mod дней с сегодняшнего дня, чтобы найти точку.Если он больше половины интервала, это означает, что нам нужно добавить interval - mod
дней, чтобы найти точку (которая будет в будущем).