How to find the 3rd Friday in a month with C#?

I followed User:Mark Ransom's algorithm and wrote a generalized day finder. For example to get the 3rd friday of december 2013,

int thirdFriday = DayFinder.FindDay(2013, 12, DayOfWeek.Friday, 3);

And here is the function definition. It doesn't have any iterative loops, so its efficient.

  public class DayFinder
  {

    //For example to find the day for 2nd Friday, February, 2016
    //=>call FindDay(2016, 2, DayOfWeek.Friday, 2)
    public static int FindDay(int year, int month, DayOfWeek Day, int occurance)
    {

        if (occurance <= 0 || occurance > 5)
            throw new Exception("Occurance is invalid");

        DateTime firstDayOfMonth = new DateTime(year, month, 1);
        //Substract first day of the month with the required day of the week 
        var daysneeded = (int)Day - (int)firstDayOfMonth.DayOfWeek;
        //if it is less than zero we need to get the next week day (add 7 days)
        if (daysneeded < 0) daysneeded = daysneeded + 7;
        //DayOfWeek is zero index based; multiply by the Occurance to get the day
        var resultedDay = (daysneeded + 1) + (7 * (occurance - 1));

        if (resultedDay > (firstDayOfMonth.AddMonths(1) - firstDayOfMonth).Days)
            throw new Exception(String.Format("No {0} occurance(s) of {1} in the required month", occurance, Day.ToString()));

        return resultedDay;
    }
}

I'm going to repeat my answer from here with one little addition.

The language-agnostic version:

To get the first particular day of the month, start with the first day of the month: yyyy-mm-01. Use whatever function is available to give a number corresponding to the day of the week; in C# this would be DateTime.DayOfWeek. Subtract that number from the day you are looking for; for example, if the first day of the month is Wednesday (3) and you're looking for Friday (5), subtract 3 from 5, leaving 2. If the answer is negative, add 7. Finally add that to the first of the month; for my example, the first Friday would be the 3rd.

To get the last Friday of the month, find the first Friday of the next month and subtract 7 days.

To get the 3rd Friday of the month, add 14 days to the first Friday.


I haven't tested this, but since the third Friday can't possibly occur before the 15th of the month, create a new DateTime, then just increment until you get to a Friday.

DateTime thirdFriday= new DateTime(yourDate.Year, yourDate.Month, 15);

while (thirdFriday.DayOfWeek != DayOfWeek.Friday)
{
   thirdFriday = thirdFriday.AddDays(1);
}

Tags:

C#

.Net

Datetime