note 30468 modified in ref.datetime by danbrown

From: Date: Sun, 20 Jul 2008 02:26:49 +0000
Subject: note 30468 modified in ref.datetime by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-141959@lists.php.net to get a copy of this message
I needed to calculate the week number from a given date and vice versa, where the week starts with a Monday and the first week of a year may begin the year before, if the year begins in the middle of the week (Tue-Sun). This is the way weekly magazines calculate their issue numbers. Here are two functions that do exactly that: Hope somebody finds this useful. Gary <?php /* w e e k n u m b e r -------------------------------------- // weeknumber returns a week number from a given date (>1970, <2030) Wed, 2003-01-01 is in week 1 Mon, 2003-01-06 is in week 2 Wed, 2003-12-31 is in week 53, next years first week Be careful, there are years with 53 weeks. // ------------------------------------------------------------ */ function weeknumber ($y, $m, $d) { $wn = strftime("%W",mktime(0,0,0,$m,$d,$y)); $wn += 0; # wn might be a string value $firstdayofyear = getdate(mktime(0,0,0,1,1,$y)); if ($firstdayofyear["wday"] != 1) # if 1/1 is not a Monday, add 1 $wn += 1; return ($wn); } # function weeknumber /* d a t e f r o m w e e k ---------------------------------- // From a weeknumber, calculates the corresponding date Input: Year, weeknumber and day offset Output: Exact date in an associative (named) array 2003, 12, 0: 2003-03-17 (a Monday) 1995, 53, 2: 1995-12-xx ... // ------------------------------------------------------------ */ function datefromweek ($y, $w, $o) { $days = ($w - 1) * 7 + $o; $firstdayofyear = getdate(mktime(0,0,0,1,1,$y)); if ($firstdayofyear["wday"] == 0) $firstdayofyear["wday"] += 7; # in getdate, Sunday is 0 instead of 7 $firstmonday = getdate(mktime(0,0,0,1,1-$firstdayofyear["wday"]+1,$y)); $calcdate = getdate(mktime(0,0,0,$firstmonday["mon"], $firstmonday["mday"]+$days,$firstmonday["year"])); $date["year"] = $calcdate["year"]; $date["month"] = $calcdate["mon"]; $date["day"] = $calcdate["mday"]; return ($date); } # function datefromweek ?> --was-- I needed to calculate the week number from a given date and vice versa, where the week starts with a Monday and the first week of a year may begin the year before, if the year begins in the middle of the week (Tue-Sun). This is the way weekly magazines calculate their issue numbers. Here are two functions that do exactly that: Hope somebody finds this useful. Gary /* w e e k n u m b e r -------------------------------------- // weeknumber returns a week number from a given date (>1970, <2030) Wed, 2003-01-01 is in week 1 Mon, 2003-01-06 is in week 2 Wed, 2003-12-31 is in week 53, next years first week Be careful, there are years with 53 weeks. // ------------------------------------------------------------ */ function weeknumber ($y, $m, $d) { $wn = strftime("%W",mktime(0,0,0,$m,$d,$y)); $wn += 0; # wn might be a string value $firstdayofyear = getdate(mktime(0,0,0,1,1,$y)); if ($firstdayofyear["wday"] != 1) # if 1/1 is not a Monday, add 1 $wn += 1; return ($wn); } # function weeknumber /* d a t e f r o m w e e k ---------------------------------- // From a weeknumber, calculates the corresponding date Input: Year, weeknumber and day offset Output: Exact date in an associative (named) array 2003, 12, 0: 2003-03-17 (a Monday) 1995, 53, 2: 1995-12-xx ... // ------------------------------------------------------------ */ function datefromweek ($y, $w, $o) { $days = ($w - 1) * 7 + $o; $firstdayofyear = getdate(mktime(0,0,0,1,1,$y)); if ($firstdayofyear["wday"] == 0) $firstdayofyear["wday"] += 7; # in getdate, Sunday is 0 instead of 7 $firstmonday = getdate(mktime(0,0,0,1,1-$firstdayofyear["wday"]+1,$y)); $calcdate = getdate(mktime(0,0,0,$firstmonday["mon"], $firstmonday["mday"]+$days,$firstmonday["year"])); $date["year"] = $calcdate["year"]; $date["month"] = $calcdate["mon"]; $date["day"] = $calcdate["mday"]; return ($date); } # function datefromweek http://php.net/manual/en/ref.datetime.php

« previous php.notes (#141959) next »