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;
}