public static void Main()
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2025, 7, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 7, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 6, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 5, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 4, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 3, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 2, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2024, 1, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 12, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 11, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 10, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 9, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 8, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 7, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 6, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 5, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 4, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 3, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 2, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2023, 1, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 12, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 11, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 10, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 9, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 8, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 7, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 6, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 5, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 4, 5)));
Console.WriteLine("-------------------------");
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 3, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 2, 5)));
Console.WriteLine(BasePeriod.Determine(new DateTime(2024, 7, 5), new DateTime(2022, 1, 5)));
public enum BasePeriodType
public static class BasePeriod
public static BasePeriodType Determine(DateTime effectiveDate, DateTime startOfBasePeriod)
int effectiveDateQuarter = (int) Math.Ceiling(effectiveDate.Month / 3m);
int startOfBasePeriodQuarter = (int) Math.Ceiling(startOfBasePeriod.Month / 3m);
var yearDifference = effectiveDate.Year - startOfBasePeriod.Year;
var numberOfQuartersAgo = ((4 - startOfBasePeriodQuarter) + effectiveDateQuarter) + (4 * (yearDifference - 1));
if(numberOfQuartersAgo == 4){
return BasePeriodType.Alternate;
if(numberOfQuartersAgo == 5) {
return BasePeriodType.Regular;
if(numberOfQuartersAgo > 5) {
return BasePeriodType.Extended;
return BasePeriodType.Unknown;