March 11, 2009

Calculating Week of the Month from a given date [ PHP ]

Let first understand the problem. In the following fig. we have 2 months calendar of March 2009 to April 2009.

Now 31st March and 1st April, both dates belong to 14th Week of the Year, but in Week of the Month Calculation 31st March will be 5th Week of March and 1st April will be 1st Week of April. There is no such format is available for PHP date() function , so we will calculate the Week of the Month Programmatically.

Test Case: the program should return 1st week of March and 2nd Week of April respectively for given dates (dd/mm/yyyy) 07/03/2009 and 07/04/2009.

The Week of the Month can be determined by following equation










We can implement the equation in a PHP function as bellow

function getWeekOfTheMonth($dateTimestamp)
{
$d = date('j',$ dateTimestamp);
$w = date('w',$ dateTimestamp)+1; //add 1 because date returns value between 0 to 6
$dt= (floor($dayOfMonth % 7)!=0)? floor($dayOfMonth % 7) : 7;
$k = (($w-$dt) < style="">
$W= ceil(($dayOfMonth+$k)/7);
return $W ;
}

Now check the function with Test Cases.
For 07/03/2009 or 7th March 2009:
$dateTimestamp = mktime(0,0,0,3,7,2009);
echo getWeekOfTheMonth($dateTimestamp) ." week of ".date(F,$dateTimestamp);

and the o/p is
1 week of March
For 07/04/2009 or 7th April 2009
$dateTimestamp = mktime(0,0,0,4,7,2009);
echo getWeekOfTheMonth($dateTimestamp) ." week of ".date(F,$dateTimestamp);

and the o/p is
2 week of April


(c) Sourav Ray Creative Commons License

3 comments:

  1. Surely just ceil(d/7) will return the relevant week number of the month? It won't return the W number of PHP date() but is perfectly adequate.

    ReplyDelete
  2. @UKuser I don't understand how ceil(d/7) return you an adequate result...
    take the example of 7th April 2009, It is actually a day of the 2nd week of the month, but just doing a ceil(d/7) will return you 1....
    So if you are using this logic to read data from logs that are arranged in an week of the month basis, then you may look into a wrong log file and will never been able to find the data you are looking for...

    ReplyDelete
  3. Dude I am using Chrome 7.0 on Mac OSX 10.6 and your code sample is all messed up. It doesn't work.

    ReplyDelete