Version: 1.0

Type: Function

Category: Calendars/Dates

License: GNU General Public License

Description: Contains two functions, dayofweek() will return the day of the week for a given date (0=Sunday, 1=Monday, etc). nthDayOfMonth() will return the date of the nth weekday of a month (i.e. 2nd Tuesday of April 2001 will return 10).



/*
 * PHP Day of Week functions
 * Copyright (c) 2001, Mark Motley <mmotley@la-mirada.net>
 * GNU Public license, use as you want
 */

/*
 * dayofweek($day,$month,$year) will compute the day of the week a
 * a particular date falls.
 * 
 * Paramaters:
 *
 *   $day - Day of month [1-31]
 *   $month - Month [1-12]
 *   $year - The year [1900-?]
 *
 * Returns:
 *
 *   Numerical day of week where 0=Sunday, 1=Monday, etc.
 *   On error (out-of-bounds dates) returns -1.
 *
 */

function dayofweek($day,$month,$year) {

        /* Check date for validity */
        if (!checkdate($month,$day,$year))
                return -1;

        $a=(int)((14-$month) / 12);
        $y=$year-$a;
        $m=$month + (12*$a) - 2;

        $retval=($day + $y + (int)($y/4) - (int)($y/100) + (int)($y/400) + (int)((31*$m)/12)) % 7;

        return $retval;
}

/* phpdow_mod($a,$b) is a fixed-up modulo function that will deal with
 * negative numbers properly. PHP's modulo function doesn't, and the
 * forumulas are dependent on it.
 * It's really only here to support the nthDayOfMonth() function.
 */

function phpdow_mod($a,$b) {
        if ($a <= 0)
                return (int)phpdow_mod($b-abs($a),$b);
        else
                return (int)($a%$b);
}


/*
 * nthDayOfMonth($n,$dow,$month,$year) will compute the Nth day of the given
 * month.  For example, the first Monday in April 2001.
 *
 * Parameters:
 *
 *  $n - the Nth day you want, i.e. 2 for 2nd 
 *  $dow - The day of week you want, 0=Sunday, 1=Monday, etc. [0-6]
 *  $month - The month you want [1-12]
 *  $year - The full year [1900? - ??]
 *
 * Returns:
 * 
 *  The date, in the month you passed, that fits the criteria.
 *  Here we return to error conditions:
 *    -1 = invalid date
 *    -2 = There is no Nth day of that month, like no 5th Tuesday
 *         of the specified month
 *
 * Example:
 *
 *  To find the first Tuesday in June 2001:
 *     $day = nthDayInMonth(1,2,6,2001);
 *  will return 4, which means the first Tuesday in June is 6/4/2001.
 *
 */

function nthDayOfMonth($n,$dow,$month,$year) {

        /* Check the date */
        if ($month > 12) 
                return -1;

        if ($dow > 6)
                return -1;

        /* Valid Nth day, should be no more than 5 */
        if (($n <= 0) || ($n > 5))
                return -1;

        $retval = (7*$n)-6+phpdow_mod($dow-dayofweek(1,$month,$year),7);

        /* Make sure the date is not greater than the number of days
           in the month */
        if (!checkdate($month,$retval,$year))
                return -2;

        /* Otherwise we return the date */
        return $retval;
}