using System.Collections.Generic;
public static void Main()
var start = "03/01/2020";
var end = DateTime.UtcNow;
var payperiods = MonthlyBuilder(DateTime.Parse(start), end);
foreach (var payperiod in payperiods)
Console.WriteLine("PayPeriodStart: " + payperiod.PayPeriodStart.ToString());
Console.WriteLine("PayPeriodEnd: " + payperiod.PayPeriodEnd.ToString());
Console.WriteLine("PayDate: " + payperiod.PayDate.ToString());
public static List<PayPeriodDates> MonthlyBuilder(DateTime startDate, DateTime endDate)
var payDates = new List<PayPeriodDates>();
var candidateStart = startDate;
while (candidateStart <= endDate)
var dates = new PayPeriodDates();
dates.PayPeriodStart = candidateStart;
while (candidateStart.Day != 1)
candidateStart = candidateStart.AddDays(1);
var candidateEnd = candidateStart.AddMonths(1).AddDays(-1);
dates.PayPeriodEnd = candidateEnd <= endDate ? candidateEnd : endDate;
dates.PayDate = candidateStart.AddMonths(1) >= endDate ? endDate : candidateStart.AddMonths(1);
candidateStart = candidateStart.AddMonths(1);
public class PayPeriodDates
public DateTime PayPeriodStart { get; set; }
public DateTime PayPeriodEnd { get; set; }
public DateTime PayDate { get; set; }