public static void Main()
TimeSpan tsStart = new TimeSpan(2,0,0);
TimeSpan tsEnd = new TimeSpan(3,0,0);
var startDate = CreateDate(2020, 9, 5, DayOfWeek.Sunday, tsStart);
var endDate = CreateDate(2020,4,1, DayOfWeek.Sunday, tsEnd);
TimeSpan tsStartBR = new TimeSpan(23,59,59);
TimeSpan tsEndBR = new TimeSpan(23,59,59);
var startDateBR = CreateDate(2018, 11, 1, DayOfWeek.Saturday, tsStartBR);
var endDateBR = CreateDate(2018, 2,3, DayOfWeek.Saturday, tsEndBR);
Console.WriteLine(startDate.ToString());
Console.WriteLine(endDate.ToString());
Console.WriteLine(startDateBR.ToString());
Console.WriteLine(endDateBR.ToString());
private static DateTime CreateDate(int year, byte month, byte weekOfMonth, DayOfWeek originalDayOfWeek, TimeSpan timeOfDay)
var dayOfWeek = originalDayOfWeek;
DateTime dt = new DateTime(year, month, 1, timeOfDay.Hours, timeOfDay.Minutes, timeOfDay.Seconds);
var lastDayMonth = dt.AddMonths(1).AddDays(-1);
while (dt.Date <= lastDayMonth.Date)
if(dt.DayOfWeek == DayOfWeek.Sunday && dt.Day > 1 && weekOfMonth > numbersOfWeek)
if (dayOfWeek == dt.DayOfWeek && weekOfMonth == numbersOfWeek)
throw new Exception("The week of the month informed doesn't have the day of week informed.");