using System.Collections.Generic;
public static void Main()
var arr = new List<(DateTime, DateTime)>()
(new DateTime(2021, 12, 15),new DateTime(2022, 2, 27)) ,
(new DateTime(2022, 1, 31),new DateTime(2022, 2, 27)) ,
(new DateTime(2022, 2, 1),new DateTime(2022, 2, 19)) ,
(new DateTime(2022, 2, 20),new DateTime(2022, 12, 30)) ,
(new DateTime(2021, 11, 30),new DateTime(2022, 12, 30)) ,
(new DateTime(2021, 11, 30),new DateTime(2022, 2, 25)) ,
(new DateTime(2021, 07, 31),new DateTime(2022, 9, 25)) ,
foreach(var item in arr){
DateTime paymentStartDate = item.Item1;
DateTime asOfDate = item.Item2;
Console.WriteLine("Start: "+paymentStartDate+"; asOf: "+asOfDate+"; result: "+ForwardToNextMonth(paymentStartDate, asOfDate));
public static DateTime ForwardToNextMonth(DateTime paymentStartDate, DateTime asOfDate)
if (paymentStartDate > asOfDate)
int day = paymentStartDate.Day;
int daysInMonth = DateTime.DaysInMonth(asOfDate.Year, asOfDate.Month);
var nextDate = new DateTime(asOfDate.Year, asOfDate.Month, day > daysInMonth ? daysInMonth : day);
while (asOfDate > nextDate)
nextDate = nextDate.AddMonths(1);
daysInMonth = DateTime.DaysInMonth(nextDate.Year, nextDate.Month);
return new DateTime(nextDate.Year, nextDate.Month, day > daysInMonth ? daysInMonth : day);