using System.Collections.Generic;
using Express.Recurrence;
public static void Main()
var dates = new List<DateTime>();
var startDate = new DateTime(2023,4,1);
var endDate = new DateTime(2023,4,30);
var rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Daily, Interval = 1 };
var basePattern = new BasePattern { StartDate = startDate, EndDate = endDate, EndMode = ENDMODE.ByDate };
var daySettings1 = new DayReccurance
Constrain = DAYCONSTRAIN.NDay,
Console.WriteLine($"****** Daily Every {daySettings1.Next} days until {endDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateDays(basePattern, daySettings1).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Daily, Interval = 4 };
var daySettings2 = new DayReccurance
Constrain = DAYCONSTRAIN.NDay,
Console.WriteLine($"****** Daily Every 2 Days until {endDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateDays(basePattern, daySettings2).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Weekly, Interval = 1,
DaysOfWeek = new List<DayOfWeekEnum> {
var weekSettings1 = new WeeklyReccurance
SetWeekDays(weekSettings1, rp);
Console.WriteLine($"****** Weekly Every Tuesday and Thursday until {endDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateWeeks(basePattern, weekSettings1).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Weekly, Interval = 2,
DaysOfWeek = new List<DayOfWeekEnum> {
var weekSettings2 = new WeeklyReccurance
SetWeekDays(weekSettings2, rp);
Console.WriteLine($"****** Weekly Every 2 Weeks Tuesday and Thursday until {endDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateWeeks(basePattern, weekSettings2).Values;
basePattern.EndDate = new DateTime(2024,1,30);
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Monthly, Interval = 1, DayOfMonth = 13 };
var monthlySettings = new MonthlyReccurance
Constrain = MONTHCONSTRAIN.SpecificDay,
DayOfMonth = rp.DayOfMonth
Console.WriteLine($"****** Monthly Every {rp.Interval} (Monthly) on Day {rp.DayOfMonth} until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateMonths(basePattern, monthlySettings).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Monthly, Interval = 2, DayOfMonth = 13 };
var monthlySettings2 = new MonthlyReccurance
Constrain = MONTHCONSTRAIN.SpecificDay,
DayOfMonth = rp.DayOfMonth
Console.WriteLine($"****** Monthly Every {rp.Interval} Months on Day {rp.DayOfMonth} until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateMonths(basePattern, monthlySettings2).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Monthly, Interval = 1, Ordinal = 4,
DaysOfWeek = new List<DayOfWeekEnum> { DayOfWeekEnum.Friday } };
var monthlySettings3 = new MonthlyReccurance
Constrain = MONTHCONSTRAIN.Logical
SetOrdinal(monthlySettings3, rp);
SetWeekDays(monthlySettings3, rp);
Console.WriteLine($"****** Monthly Every {rp.Ordinal}th Friday until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateMonths(basePattern, monthlySettings3).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Monthly, Interval = 1, Ordinal = -1,
DaysOfWeek = new List<DayOfWeekEnum> { DayOfWeekEnum.Friday } };
var monthlySettings4= new MonthlyReccurance
Constrain = MONTHCONSTRAIN.Logical
SetOrdinal(monthlySettings4, rp);
SetWeekDays(monthlySettings4, rp);
Console.WriteLine($"****** Monthly Every Last Friday until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateMonths(basePattern, monthlySettings4).Values;
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Monthly, Interval = 3, Ordinal = 4,
DaysOfWeek = new List<DayOfWeekEnum> { DayOfWeekEnum.Friday } };
var monthlySettings5= new MonthlyReccurance
Constrain = MONTHCONSTRAIN.Logical
SetOrdinal(monthlySettings5, rp);
SetWeekDays(monthlySettings5, rp);
Console.WriteLine($"****** Monthly Every {rp.Interval} Months on {rp.Ordinal}th Friday until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateMonths(basePattern, monthlySettings5).Values;
basePattern.EndDate = new DateTime(2028,1,30);
rp = new RecurrencePattern { Type = RecurrenceTypeEnum.Yearly, Interval = 1, DayOfMonth = 4, MonthOfYear = 7 };
var yearlySettings= new YearlyReccurance
Constrain = YEARCONSTRAIN.Logical,
LogicalStart= LOGICALSTART.First,
AdjustDays = rp.DayOfMonth-1
Console.WriteLine($"****** Yearly on {rp.MonthOfYear}th Month, Day {rp.DayOfMonth} until {basePattern.EndDate} ****** {Environment.NewLine}");
dates = Reccurance.GenerateYears(basePattern, yearlySettings).Values;
public static void PrintDates(List<DateTime> dates)
Console.WriteLine(Environment.NewLine);
public static void SetWeekDays(WeeklyReccurance wSettings, RecurrencePattern rp)
foreach(var w in rp.DaysOfWeek)
case DayOfWeekEnum.Monday: wSettings.Monday = true; break;
case DayOfWeekEnum.Tuesday: wSettings.Tuesday = true; break;
case DayOfWeekEnum.Wednesday: wSettings.Wednesday = true; break;
case DayOfWeekEnum.Thursday: wSettings.Thursday = true; break;
case DayOfWeekEnum.Friday: wSettings.Friday = true; break;
case DayOfWeekEnum.Saturday: wSettings.Saturday = true; break;
case DayOfWeekEnum.Sunday: wSettings.Sunday = true; break;
public static void SetOrdinal(MonthlyReccurance mSettings, RecurrencePattern rp)
case 1: mSettings.LogicalStart = LOGICALSTART.First; break;
case 2: mSettings.LogicalStart = LOGICALSTART.Second; break;
case 3: mSettings.LogicalStart = LOGICALSTART.Third; break;
case 4: mSettings.LogicalStart = LOGICALSTART.Fourth; break;
case -1: mSettings.LogicalStart = LOGICALSTART.Last; break;
public static void SetWeekDays(MonthlyReccurance mSettings, RecurrencePattern rp)
foreach(var w in rp.DaysOfWeek)
case DayOfWeekEnum.Monday: mSettings.LogicalDay = LOGICALDAY.Monday; break;
case DayOfWeekEnum.Tuesday: mSettings.LogicalDay = LOGICALDAY.Tuesday; break;
case DayOfWeekEnum.Wednesday: mSettings.LogicalDay = LOGICALDAY.Wednesday; break;
case DayOfWeekEnum.Thursday: mSettings.LogicalDay = LOGICALDAY.Thursday; break;
case DayOfWeekEnum.Friday: mSettings.LogicalDay = LOGICALDAY.Friday; break;
case DayOfWeekEnum.Saturday: mSettings.LogicalDay = LOGICALDAY.Saturday; break;
case DayOfWeekEnum.Sunday: mSettings.LogicalDay = LOGICALDAY.Sunday; break;
public enum RecurrenceTypeEnum {
public enum DayOfWeekEnum{
public class RecurrencePattern
public RecurrenceTypeEnum Type { get; set; }
public int Interval { get; set; }
public List<DayOfWeekEnum> DaysOfWeek { get; set; }
public int Ordinal { get; set; }
public int DayOfMonth { get; set; }
public int MonthOfYear { get; set; }
public DateTime TerminationDate { get; set; }