/// <summary>
 ///     Finds the total number of instances of a specific DayOfWeek in a month.
 /// </summary>
 /// <param name="dayOfWeek">The day of week.</param>
 /// <param name="year">The year.</param>
 /// <param name="month">The month.</param>
 /// <returns></returns>
 public static int TotalInstancesInMonth(
     this DayOfWeek dayOfWeek,
     int year,
     int month)
 {
     return(DateTimeExtensions.DaysOfMonth(year, month).Count(date => dayOfWeek.Equals(date.DayOfWeek)));
 }
    /// <summary>
    ///     Finds the NTH week day of a month.
    /// </summary>
    /// <param name="dayOfWeek">The day of week.</param>
    /// <param name="year">The year.</param>
    /// <param name="month">The month.</param>
    /// <param name="n">The nth instance.</param>
    /// <remarks>Compensates for 4th and 5th DayOfWeek of Month</remarks>
    public static DateTime FindNthWeekDayOfMonth(
        this DayOfWeek dayOfWeek,
        int year,
        int month,
        int n)
    {
        if (n is < 1 or > 5)
        {
            throw new ArgumentOutOfRangeException(nameof(n));
        }

        var y = 0;

        IEnumerable <DateTime> daysOfMonth = DateTimeExtensions.DaysOfMonth(year, month);

        // compensate for "last DayOfWeek in month"
        var totalInstances = dayOfWeek.TotalInstancesInMonth(year, month);

        if (n == 5 &&
            n > totalInstances)
        {
            n = 4;
        }

        var foundDate = daysOfMonth
                        .Where(date => dayOfWeek.Equals(date.DayOfWeek))
                        .OrderBy(date => date)
                        .Select(x => new { n = ++y, date = x })
                        .Where(x => x.n.Equals(n))
                        .Select(x => x.date)
                        .First(); //black magic wizardry

        return(foundDate);
    }
Example #3
0
        public void DaysOfMonth_Test()
        {
            var days = DateTimeExtensions.DaysOfMonth(2018, 1);

            days.ShouldNotBeNull();

            days.Count().ShouldBe(31);
        }
 public static DateTime NthDayOfMonthFrom(
     this List <DayOfWeek> daysOfWeek,
     int year,
     int month,
     int nth
     )
 {
     return
         (DateTimeExtensions.DaysOfMonth(year, month)
          .Where(
              date => daysOfWeek.Contains(date.DayOfWeek)
              )
          .Skip(nth - 1)
          .First());
 }