using System.Collections.Generic;
public static void Main()
DateRange dr = new DateRange();
dr.PrepareSlots (DateTime.UtcNow, DateTime.UtcNow.AddYears(1), RecurenceTypes.Monthly, new List<DayOfWeek>() { DayOfWeek.Monday, DayOfWeek.Wednesday });
Console.WriteLine("Current " + DateTime.UtcNow + " Next " + DateTime.UtcNow.AddYears(1));
private Dictionary<DateTime, DayOfWeek> Range { get; set; }
Range = new Dictionary<DateTime, DayOfWeek>();
public void PrepareWeeklySlots(DateTime start, DateTime end, IEnumerable<DayOfWeek> dayOfWeeks)
while (date.Date >= DateTime.Now.Date && date.Date <= end.Date)
foreach (var dayOfWeek in dayOfWeeks)
var nextDay = date.Date.GetNextDayOfWeek(dayOfWeek);
if (dayOfWeek == nextDay.DayOfWeek && nextDay.Date >= date.Date && nextDay.Date <= end.Date)
Range.Add(nextDay, dayOfWeek);
date = date.AddDays(7).GetNextWeekStartingDate();
public void PrepareMonthlySlots(DateTime start, DateTime end, IEnumerable<DayOfWeek> dayOfWeeks)
while (date.Date >= DateTime.UtcNow.Date && date.Date <= end.Date)
PrepareWeeklySlots(date, date.GetFirstDayOfNextMonth().AddDays(-1), dayOfWeeks);
date = date.GetFirstDayOfNextMonth();
public void PrepareYearlySlots(DateTime start, DateTime end, IEnumerable<DayOfWeek> dayOfWeeks)
while (date.Date < end.Date)
if (date.Date >= DateTime.UtcNow.Date && date.Date <= end.Date)
PrepareWeeklySlots(start, date.GetNextYear(), dayOfWeeks);
date = date.GetNextYear();
public void PrepareSlots(DateTime start, DateTime end, RecurenceTypes recType, IEnumerable<DayOfWeek> dayOfWeeks)
if (recType == RecurenceTypes.Monthly)
PrepareMonthlySlots(start, end, dayOfWeeks);
else if (recType == RecurenceTypes.Daily)
PrepareWeeklySlots(start, end, dayOfWeeks);
else if (recType == RecurenceTypes.YearlyOnce)
PrepareYearlySlots(start, end, dayOfWeeks);
foreach (var da in Range)
Console.WriteLine(index + ". " + da.Key.Date.ToString("dd-MMM-yyyy") + " is " + (int)da.Value);
Console.WriteLine("Recurence Count " + Range.Count);
public static class DateRangeExtensions
public static DateTime GetNextDayOfWeek(this DateTime startDate, DayOfWeek dayOfWeek)
int daysToAdd = (int)dayOfWeek - 1;
var weekStartDate = startDate.AddDays((int)DayOfWeek.Monday - (int)startDate.DayOfWeek);
return weekStartDate.AddDays(daysToAdd);
public static DateTime GetNextWeekStartingDate(this DateTime startDate)
int daysToAdd = (int)DayOfWeek.Monday - (int)startDate.DayOfWeek;
return startDate.AddDays(daysToAdd);
public static DateTime GetNextMonth(this DateTime startDate)
return startDate.AddMonths(1);
public static DateTime GetFirstDayOfNextMonth(this DateTime startDate)
var newDate = startDate.AddMonths(1);
return newDate.AddDays(startDate.Day > 2 ? 1 - startDate.Day : 0);
public static DateTime GetNextYear(this DateTime startDate)
return startDate.AddYears(1);
public enum RecurenceTypes