Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple formula for determining date using week of month?

Given a standard piece of scheduling information, such as "the second Tuesday in June 2009" or "the last Friday in July 2009", what's the simplest and most efficient formula to translate that into a date?

Inputs:

  • w = Week of month, enumeration (1st, 2nd, 3rd, 4th or Last)
  • d = Day of week, enum Sun through Sat
  • m = Month, integer
  • y = Year, integer

EDIT (again) - It doesn't matter what day the week begins on; I want to get the wth instance of d in the given month. Thus the 2nd Sunday in June 2009 is 14 June, even though that technically falls in the 3rd week of June; similarly the 1st Sunday in June is 7 June, not null/exception.

like image 437
Shaul Behr Avatar asked Jun 02 '09 13:06

Shaul Behr


People also ask

How do you calculate weeks from month to date?

Calculation of Number of Weeks in a Month For example, the month of August has 31 days (1 week = 7 days). Thus, 31/7= 4 weeks + 3 days.

What is the formula to calculate in a week?

To determine how many weeks elapsed between two dates, we can use a simple formula to find the number of days between the dates, then divide by 7. The formula will return a decimal number.


2 Answers

Something like:

static DateTime GetDate(int year, int month, DayOfWeek dayOfWeek,
        int weekOfMonth) {
    // TODO: some range checking (>0, for example)
    DateTime day = new DateTime(year, month, 1);
    while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1);
    if (weekOfMonth > 0) {
        return day.AddDays(7 * (weekOfMonth - 1));
    } else { // treat as last
        DateTime last = day;
        while ((day = day.AddDays(7)).Month == last.Month) {
            last = day;
        }
        return last;
    }
}
like image 141
Marc Gravell Avatar answered Sep 19 '22 22:09

Marc Gravell


EDITED to fix bug when weekday asked for was same as dayof week of first of month.

2nd edit to fix issue disc' by Marc

static DateTime GetDate(int year, int month, 
                DayOfWeek weekDay, int week)
{  
    DateTime first = new DateTime(year, month, 1);
    int iDow = (int)weekday, iFirst = (int)first.DayOfWeek;
    int adjust = (7+iDow-iFirst)%7 - 7;
    return first.AddDays(7*week + adjust);
}
like image 38
Charles Bretana Avatar answered Sep 19 '22 22:09

Charles Bretana