public override DateTime CalculateDate(DateTime start, DateTime end)
{
for (var year = start.Year; year <= end.Year; year++)
{
// first calculate Easter Sunday
var goldenNumber = year % 19;
var century = year / 100;
var h = (century - century / 4 - (8 * century + 13) / 25 + 19 * goldenNumber + 15) % 30;
var i = h - h / 28 * (1 - h / 28 * (29 / (h + 1)) * ((21 - goldenNumber) / 11));
var day = i - (year + year / 4 + i + 2 - century + century / 4) % 7 + 28;
var month = 3;
if (day > 31)
{
month++;
day -= 31;
}
var proposed = new DateTime(year, month, day);
switch (Day)
{
case DayOfWeek.Friday:
proposed = proposed.AddDays(-2);
break;
case DayOfWeek.Sunday:
break;
case DayOfWeek.Monday:
proposed = proposed.AddDays(1);
break;
case DayOfWeek.Tuesday:
proposed = proposed.AddDays(2);
break;
default:
throw new NotSupportedException("Only Easter Friday, Monday, and Tuesday are supported.");
}
if (proposed >= start && proposed <= end)
{
return proposed;
}
}
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
"Cannot find a suitable date between {0} and {1}", start, end));
}
}