В течение полугодового месяца, если ваш первый платеж всегда был первым платежом месяца (то есть, в любое время с 1-го по 13-е, начиная с 13-го, проблематично, как обсуждалось в комментариях), вы можете сделать так:следует:
// assuming first payment will be 1st of month, add month for every 2 payments
// num payments / 2 (int division, remainder is chucked)
// then add 15 days if this is even payment of the month
LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) / 2)
.AddDays((NumberOfPayments % 2) == 0 ? 15 : 0);
Таким образом, для 1-го платежа это добавит 0 месяцев и 0 дней, поэтому будет 1-й датой оплаты.Для 2-го платежа это добавит 0 месяцев (int dividision, остаток отсчитывается) и 15 дней для 16-го числа месяца.Для 3-го платежа это добавит 1 месяц (1/3) и 0 дней для 1-го числа следующего месяца и т. Д.
Это предполагает, что FirstPaymentDate будет иметь значение 1-го числа данного месяца.Вы, вероятно, можете увидеть, куда идти отсюда, если вы хотите, чтобы 16-е было начальной датой и т. Д.
Имеет смысл?
Итак, чтобы проиллюстрировать, если бы у нас было:
DateTime LastPaymentDate, FirstPaymentDate = new DateTime(2011, 12, 5);
for(int numOfPayments=1; numOfPayments<=24; numOfPayments++)
{
LastPaymentDate = FirstPaymentDate.AddMonths((numOfPayments - 1) / 2)
.AddDays((numOfPayments % 2) == 0 ? 15 : 0);
Console.WriteLine(LastPaymentDate);
}
Этот цикл даст нам:
12/5/2011 12:00:00 AM
12/20/2011 12:00:00 AM
1/5/2012 12:00:00 AM
// etc...
10/20/2012 12:00:00 AM
11/5/2012 12:00:00 AM
11/20/2012 12:00:00 AM