Okay, it isn't my prettiest work, but here is what it does
SUGGESTIONS WELCOME on how to clean the code up some, if you think notations are missing, etc... feel free to use if you like it
each month has either 4 or 5 weeks (52 in a year has 4 months with 5 weeks, 8 with 4)
-- problem, each year has 52 weeks 1 day, leap year has 52 weeks 2 days
-- solution, every 5.6 years we add 1 week to december, making a 5th month with 5 weeks
-- original solution was every 2 leap years add a week.. results not pretty, code is actually better written with the 5.6 year fix
every year should start with WEEK 1, containing January First
every year should end with WEEK 52 or 53, conaining last week of December, left over days will be in January WEEK 1 of the next year
$month_array = array(1,6,10,14,19,23,27,32,36,40,45,49,53);
// how many weeks per month
$m = $_GET['m']; $y = $_GET['y'];
if(!isset($_GET['m'])) { $m = date(n); }
if(!isset($_GET['y'])) { $y = date(Y); } // make sure we have a valid start point
$d = 1; $r = 1; $mo = $m-1; $test = 'valid'; // set some defaults
$year = 2001; // every 28 years add 5 weeks
while($y >= $year) {
$year = $year + '5.6'; // 5.6 yers = 1 week, flooring keeps 53 weeks in right year
if(floor($year) == $y) { $month_array[12] = 54; }
}
$last_week = $month_array[$m]-1; // get last week # for month
$pm = date("n", mktime(0, 0, 0, $m-1, 1, $y));
$py = date("Y", mktime(0, 0, 0, $m-1, 1, $y));
$nm = date("n", mktime(0, 0, 0, $m+1, 1, $y));
$ny = date("Y", mktime(0, 0, 0, $m+1, 1, $y));
$ppy = date("Y", mktime(0, 0, 0, $m, 1, $y-1));
$nny = date("Y", mktime(0, 0, 0, $m, 1, $y+1)); // move forward / backward controls
echo '
<h2 class="center">'.date("F Y", mktime(0, 0, 0, $m, 1, $y)).'</h2>
<p class="center"><a href="?m='.$m.'&y='.$ppy.'"><< Year</a> | <a href="?m='.$pm.'&y='.$py.'">< Month</a> | <a href="?m='.$nm.'&y='.$ny.'">Month ></a> | <a href="?m='.$m.'&y='.$nny.'">Year >></a></p>
<p class="clear"></p>';
while($last_week > $r) {
$result = week_of_year($m,$d,$y);
$first_result = $result[0];
if($first_result > $month_array[($mo)] && $test == 'valid') {
$result[0]--;
$result[1] = $result[1]-(60*60*24*7);
$d = $d-7;
} elseif($first_result < $month_array[($mo)] && $test == 'valid') {
$result[0]++;
$result[1] = $result[1]+(60*60*24*7);
$d = $d+7;
}
$test = 'not valid'; // this secton ensures that first week is truely first week of month, last week truely last week of month
$first_day = $result[1]-(60*60*24*6);
if($result[0] == 0 || ($result[0] == 1 && $m == 12)) { if($r != 52) { $result[0] = 52; } else { $result[0] = 53; } }
// result of bug with week 0 existing some years (try and fix)
echo '
<p>Week: <b>'.$result[0].'</b></p>';
$day_arr = array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
echo '
<table>
<tr align="center">';
foreach($day_arr as $day)
echo '
<th width="10%">'.$day.'</th>'; // print out week days as <th>
echo '
</tr>
<tr>';
while($result[1] >= $first_day) {
echo '
<td>'.date('d', $first_day).'</td>';
$first_day = $first_day+(60*60*24); // resetting the week for next weeks printing without needing to recall function
}
echo '
</tr>
</table>
<p class="clear"></p>';
$d = $d+7;
$r = $result[0]; // tie up ends
}
function week_of_year($month, $day, $year) {
$thisdate = mktime(0,0,0,$month,$day,$year);
if (date("D", mktime(0,0,0,1,1,$year)) == "Mon") {
$day1=mktime (0,0,0,1,1,$year); // if the 1st day of year is a monday then Day 1 is Jan 1
} else {
if (date("z", mktime(0,0,0,$month,$day,$year)) >= "361") {
$day1=strtotime("last Monday", mktime(0,0,0,1,1,$year+1));
} else {
$day1=strtotime("last Monday", mktime(0,0,0,1,1,$year));
} // if date supplied is in last 4 days of last year then find the monday before Jan 1 of next year
}
$dayspassed=(($thisdate - $day1)/60/60/24); // how long since day 1
if (date("D", mktime(0,0,0,$month,$day,$year))=="Sun") {
$sunday = mktime(0,0,0,$month,$day,$year);
} else {
$sunday = strtotime("next Sunday", mktime(0,0,0,$month,$day,$year));
} // when is next Sunday
$daysleft = (($sunday - $thisdate)/60/60/24);
$thisweek = ceil(($dayspassed + $daysleft+1)/7); // ceil needed for leap year effect (I think)
$week_arr = array($thisweek,$sunday);
return $week_arr;
}