public static void Main()
Log(new DateTime(2022, 1, 1));
Log(new DateTime(2023, 1, 1));
Log(new DateTime(2022, 2, 1));
Log(new DateTime(2023, 2, 1));
Log(new DateTime(2022, 4, 1));
Log(new DateTime(2023, 4, 1));
public static void Log(DateTime ytd)
Console.WriteLine($"--YTD StartDate: {ytd:yyyy/MMM/dd}--");
LogEntry(ytd, new DateTime(2023, 1, 1));
LogEntry(ytd, new DateTime(2023, 1, 2));
LogEntry(ytd, new DateTime(2023, 2, 1));
LogEntry(ytd, new DateTime(2023, 2, 2));
LogEntry(ytd, new DateTime(2023, 11, 30));
public static void LogEntry(DateTime ytdStartDate, DateTime endEffectiveDate)
Console.WriteLine($"End Effective Date:{endEffectiveDate:yyyy/MMM/dd} => QTD Start {QuarterToDateMinusOneDay(ytdStartDate, endEffectiveDate):yyyy/MMM/dd}");
public static DateTime QuarterToDateMinusOneDay(DateTime ytdStatDateTime, DateTime dt)
return ytdStatDateTime.Month == 1 && ytdStatDateTime.Day == 1 ? FirstDayOfQuarter(dt).AddDays(-1) : firstDayOfMonth(dt.AddDays(-1).AddMonths(-2)).AddDays(-1);
public static DateTime firstDayOfMonth(DateTime dt)
return dt.Day != 1 ? new DateTime(dt.Year, dt.Month, 1) : dt;
public static int GetQuarter1bIndex(DateTime date) => (int) Math.Ceiling(date.Month / 3.0);
public static DateTime FirstDayOfQuarter(DateTime thisDate)
return new DateTime(thisDate.Year, 3 * GetQuarter1bIndex(thisDate) - 2, 1);