37

So I have a script that returns the number of weeks in a particular month and year. How can I take a specific day from that month and determine if it is part of week 1,2,3,4 or 5 of that month?

4
  • Do you have just a day or is it a date with a day and year? Commented May 2, 2011 at 4:22
  • It is a date with a day and year
    – brenjt
    Commented May 2, 2011 at 4:31
  • it will be better to rename the subject of this question: will be better find week number of a day in a month!
    – albanx
    Commented Jun 21, 2012 at 7:40
  • If you are new to this question, please consider this one-liner before using any of the posted functions.
    – Iiridayn
    Commented Oct 31, 2012 at 20:54

30 Answers 30

50

The most frustrating thing I have ever tried to get working - but here it is!

<?php

    /**
     * Returns the amount of weeks into the month a date is
     * @param $date a YYYY-MM-DD formatted date
     * @param $rollover The day on which the week rolls over
     */
    function getWeeks($date, $rollover)
    {
        $cut = substr($date, 0, 8);
        $daylen = 86400;

        $timestamp = strtotime($date);
        $first = strtotime($cut . "00");
        $elapsed = ($timestamp - $first) / $daylen;

        $weeks = 1;

        for ($i = 1; $i <= $elapsed; $i++)
        {
            $dayfind = $cut . (strlen($i) < 2 ? '0' . $i : $i);
            $daytimestamp = strtotime($dayfind);

            $day = strtolower(date("l", $daytimestamp));

            if($day == strtolower($rollover))  $weeks ++;
        }

        return $weeks;
    }


    //
    echo getWeeks("2011-06-11", "sunday"); //outputs 2, for the second week of the month
?>
7
  • 1
    WOW, Works almost perfect. I just see one issue. When I change the rollover to Saturday, it marks April 30th as the sixth week but the 29th the 5th even though they are the same weeks. The 30th is the rollover day. If I change the rollover to Sunday it does some thing similar in May for the first day. Counts May 1st as the second week instead of the first week.
    – brenjt
    Commented May 2, 2011 at 14:25
  • 1
    Hmmmm.. Damn, so close. Maybe if you added a small if statement to see if the rollover day is the first day of the month or not? I'm stumped.
    – Marty
    Commented May 3, 2011 at 0:08
  • That's exactly what I thought. I'm going to determine if the rollover is the first day or last day and make an adjustment there. I think it should work off of that.
    – brenjt
    Commented May 3, 2011 at 14:45
  • 3
    my +1 is not enough for this answer... saved my ass today! Thanks
    – footy
    Commented Mar 10, 2012 at 11:49
  • +1 for the original solution, in addition to Abhilash's fix, I'd like to pay my tribute also by suggesting using date("D") for $day and sanitizing the rollover with substr(strtolower($rollover),0,3) at the start of the function. (So 'Monday', 'mon', 'Monster' would all work as rollover for Monday)
    – Scott Yang
    Commented Jul 24, 2013 at 4:02
26

Edit: so much for "single line" - needed variables to avoid recomputation with the conditional. Tossed in a default argument while I was at it.

function weekOfMonth($when = null) {
    if ($when === null) $when = time();
    $week = date('W', $when); // note that ISO weeks start on Monday
    $firstWeekOfMonth = date('W', strtotime(date('Y-m-01', $when)));
    return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}

Please note that weekOfMonth(strtotime('Oct 31, 2011')); will return 6; some rare months have 6 weeks in them, contrary to OP's expectation. January 2017 is another month with 6 ISO weeks - Sunday the 1st falls in the last year's week, since ISO weeks start on Monday.

For starshine531, to return a 0 indexed week of the month, change the return 1 + to return 0 + or return (int).

For Justin Stayton, for weeks starting on Sunday instead of Monday I would use strftime('%U' instead of date('W', as follows:

function weekOfMonth($when = null) {
    if ($when === null) $when = time();
    $week = strftime('%U', $when); // weeks start on Sunday
    $firstWeekOfMonth = strftime('%U', strtotime(date('Y-m-01', $when)));
    return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}

For this version, 2017-04-30 is now in week 6 of April, while 2017-01-31 is now in week 5.

6
  • 2015-12-21 returns a 4, but should return a 3. Commented Oct 9, 2015 at 21:18
  • @starshine531 The week in month is indexed starting at 1 instead of 0 - looking at a calendar for December 2015 with that in mind it would appear that 4 is the correct value.
    – Iiridayn
    Commented Oct 10, 2015 at 6:34
  • 1
    Keep in mind that W uses Monday as the start of the week, so this won't work if you use Sunday as the start of the week. Commented May 4, 2016 at 17:52
  • I'd probably use ((int) strftime("%U", $day)) - ((int) strftime("%U", strtotime(date('Y-m-01', $day)))) + 1 then, though I've not tested it extensively.
    – Iiridayn
    Commented May 4, 2016 at 20:15
  • 1
    @JoshMountain yeah, date("W", strtotime('2017-01-01)) returns 52. I'll have to add a special check for January, since days can fall into the last week of the prior year. Can't use simple modular arithmetic due to "leap weeks" either: en.wikipedia.org/wiki/ISO_week_date. I'll update it in the next few days.
    – Iiridayn
    Commented Jan 9, 2017 at 22:58
14
public function getWeeks($timestamp)
{
    $maxday    = date("t",$timestamp);
    $thismonth = getdate($timestamp);
    $timeStamp = mktime(0,0,0,$thismonth['mon'],1,$thismonth['year']);    //Create time stamp of the first day from the give date.
    $startday  = date('w',$timeStamp);    //get first day of the given month
    $day = $thismonth['mday'];
    $weeks = 0;
    $week_num = 0;

    for ($i=0; $i<($maxday+$startday); $i++) {
        if(($i % 7) == 0){
            $weeks++;
        }
        if($day == ($i - $startday + 1)){
            $week_num = $weeks;
        }
      }     
    return $week_num;
}

Hello all i have been struggling for the whole day trying to figure this code out, i finally figured it out so i thought i would share it with you all.

all you need to do is put a time stamp into the function and it will return the week number back to you.

thanks

3
  • 2015-12-21 produces a 4 instead of an expected 3. Commented Oct 9, 2015 at 22:47
  • 2
    Because it is in the fourth week Commented Oct 28, 2015 at 13:06
  • My apologies, what I needed was the 3rd Monday, but that is a little different than what this code does. It is indeed the 4th week. Commented Nov 5, 2015 at 23:29
6

there is a problem with this method. if the passing date (Lets say 2012/01/01 which is a Sunday) and "$rollover" day is "Sunday", then this function will return 2. where its actually is 1'st week. i think i have fixed it in following function. please add comments to make it better.

function getWeeks($date, $rollover)
{
    $cut        = substr($date, 0, 8);
    $daylen     = 86400;
    $timestamp  = strtotime($date);
    $first      = strtotime($cut . "01");   
    $elapsed    = (($timestamp - $first) / $daylen)+1;
    $i          = 1;
    $weeks      = 0;
    for($i==1; $i<=$elapsed; $i++)
    {
        $dayfind        = $cut . (strlen($i) < 2 ? '0' . $i : $i);
        $daytimestamp   = strtotime($dayfind);
        $day            = strtolower(date("l", $daytimestamp));
        if($day == strtolower($rollover))
        {
            $weeks++;  
        }
    } 
    if($weeks==0)
    {
        $weeks++; 
    }
    return $weeks;  
}
2
  • This function produces a 1 on 2016-02-08 when a 2 was expected. Commented Oct 9, 2015 at 22:42
  • However, this function you built was the basis for the one I actually used, so you get a upvote. Commented Oct 20, 2015 at 1:59
6

This is a solution based on sberry's mathematical solution but using the PHP DateTime class instead.

function week_of_month($date) {
    $first_of_month = new DateObject($date->format('Y/m/1'));
    $day_of_first = $first_of_month->format('N');
    $day_of_month = $date->format('j');
    return floor(($day_of_first + $day_of_month - 1) / 7) + 1;
}
1
  • Not sure which version of PHP you're using, but mine has a DateTime class, but not a DateObject class, but changing that was easy. Also, this has to be passed a DateTime object in order to function. This function would be better if it could accept either a DateTime object or a string date. Commented May 20, 2015 at 22:25
4

Just Copy and Past the code and pass month and year.

e.g month=04 year=2013.

That's exactly what You Need.

$mm= $_REQUEST['month'];
$yy= $_REQUEST['year'];
$startdate=date($yy."-".$mm."-01") ;
$current_date=date('Y-m-t');
$ld= cal_days_in_month(CAL_GREGORIAN, $mm, $yy);
$lastday=$yy.'-'.$mm.'-'.$ld;
$start_date = date('Y-m-d', strtotime($startdate));
$end_date = date('Y-m-d', strtotime($lastday));
$end_date1 = date('Y-m-d', strtotime($lastday." + 6 days"));
$count_week=0;
$week_array = array();

for($date = $start_date; $date <= $end_date1; $date = date('Y-m-d', strtotime($date. ' + 7 days')))
{
    $getarray=getWeekDates($date, $start_date, $end_date);
echo "<br>";
$week_array[]=$getarray;
    echo "\n";
$count_week++;

}

// its give the number of week for the given month and year
echo $count_week;
//print_r($week_array);

function getWeekDates($date, $start_date, $end_date)
{
    $week =  date('W', strtotime($date));
    $year =  date('Y', strtotime($date));
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1"));
    if($from < $start_date) $from = $start_date;

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-6")); 
    if($to > $end_date) $to = $end_date;

$array1 = array(
        "ssdate" => $from,
        "eedate" => $to,
);

return $array1;

   // echo "Start Date-->".$from."End Date -->".$to;
}

for($i=0;$i<$count_week;$i++)
{   
$start= $week_array[$i]['ssdate'];
echo "--";

$week_array[$i]['eedate'];
echo "<br>";
}

OUTPUT:

week( 0 )=>2013-03-01---2013-03-02

week( 1 )=>2013-03-03---2013-03-09

week( 2 )=>2013-03-10---2013-03-16

week( 3 )=>2013-03-17---2013-03-23

week( 4 )=>2013-03-24---2013-03-30

week( 5 )=>2013-03-31---2013-03-31
3

I think I found an elegant solution

$time = time(); // or whenever
$week_of_the_month = ceil(date('d', $time)/7);
2
  • 1
    This will only work if you are trying to count 7 day intervals in a month, or if the month happens to start on the same day as the week does.
    – Iiridayn
    Commented Aug 30, 2013 at 13:53
  • This is the solution I was looking for however to be fair it is more about telling what number of any particular week day it is in the month rather than what week it is.
    – jessier3
    Commented Jun 20, 2016 at 20:15
3

For a Monday-Sunday (ISO 8601) week (or, if you simply don't care), you can do this in one line:

function get_week_of_month($date) {
 return date('W', $date) - date('W', strtotime(date("Y-m-01", $date))) + 1;
}

(Source)

For anything else, (e.g. a Sunday-Saturday week), you just need to tweak $date inside the function:

function get_week_of_month($date) {
 $date += 86400; //For weeks starting on Sunday
 return date('W', $date) - date('W', strtotime(date("Y-m-01", $date))) + 1;
}

(Thanks to these guys/gals)

NOTE: You may run into some issues at the end of the year (e.g. around 12/31, 1/1, etc.). Read more here.

1
  • 1
    i like this answer because it does the simplistic approach that @liridayn took, plus makes it into a function, and explains how to tweak the week start day
    – RozzA
    Commented Nov 2, 2016 at 20:55
3

This is the snippet that I made to fulfill my requirements for the same. Hope this will help you.

    function getWeek($timestamp) {
     $week_year = date('W',$timestamp);
     $week = 0;//date('d',$timestamp)/7;
     $year = date('Y',$timestamp);
     $month = date('m',$timestamp);
     $day = date('d',$timestamp);
     $prev_month = date('m',$timestamp) -1;
    if($month != 1 ){
        $last_day_prev = $year."-".$prev_month."-1";
        $last_day_prev = date('t',strtotime($last_day_prev));
        $week_year_last_mon = date('W',strtotime($year."-".$prev_month."-".$last_day_prev));
        $week_year_first_this = date('W',strtotime($year."-".$month."-1"));
        if($week_year_first_this == $week_year_last_mon){
            $week_diff = 0;
        }
        else{
            $week_diff = 1;
        }
        if($week_year ==1 && $month == 12 ){
        // to handle December's last two days coming in first week of January
            $week_year = 53;
        }
        $week = $week_year-$week_year_last_mon + 1 +$week_diff;
    }
    else{
     // to handle first three days January coming in last week of December.
        $week_year_first_this = date('W',strtotime($year."-01-1"));
        if($week_year_first_this ==52 || $week_year_first_this ==53){
            if($week_year == 52 || $week_year == 53){
                $week =1;
            }
            else{
                $week = $week_year + 1;
            }
        }
        else{
            $week = $week_year;
        }
    }
    return $week;
}
2

This is probably not a good way to do this but it's my first thought and I'm really tired.

Put all your dates into an array. The date object must have a day name (Monday). Create a method that searches the array and when ever you hit a Sunday you add 1 to a week counter. Once you find the date you're looking for return the week counter. That is the week the day falls in of the year. For the week in the month you have to reset the week counter every time you get to the last day in each month.

4
  • True. I don't even think the date class can help, but I'm not entirely sure. Commented May 2, 2011 at 4:40
  • 1
    Sounds like a logical method and simple enough, I wonder if there is an easier way
    – brenjt
    Commented May 2, 2011 at 4:41
  • I'm in the process of looking, just out of curiosity. This is a good question Commented May 2, 2011 at 4:42
  • @Marty It stinks that the weeks start on a Monday Commented May 2, 2011 at 4:46
2

Here comes two liner:

function getWeekOfMonth(DateTime $date) {
    $firstDayOfMonth = new DateTime($date->format('Y-m-1'));

    return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}

And Wtower's solutions doesn't work 100% properly.

1

Thought I'd share my function as well. This returns an array of weeks. Every week is an array with weeks day (0..6) as key and months day (1..31) as value.

Function assumes that week starts with Sunday.

Enjoy!

function get_weeks($year, $month){

    $days_in_month = date("t", mktime(0, 0, 0, $month, 1, $year));
    $weeks_in_month = 1;
    $weeks = array();

    //loop through month
    for ($day=1; $day<=$days_in_month; $day++) {

        $week_day = date("w", mktime(0, 0, 0, $month, $day, $year));//0..6 starting sunday

        $weeks[$weeks_in_month][$week_day] = $day;

        if ($week_day == 6) {
            $weeks_in_month++;
        }

    }

    return $weeks;

}
1

My 5 cents:

/**
* calculate number of weeks in a particular month
*/
function weeksInMonth($month=null,$year=null){

    if( null==($year) ) {
        $year =  date("Y",time());  
    }

    if(null==($month)) {
        $month = date("m",time());
    }

    // find number of days in this month
    $daysInMonths =  date('t',strtotime($year.'-'.$month.'-01'));

    $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);

    $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));

    $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));

    if($monthEndingDay<$monthStartDay){

        $numOfweeks++;

    }

    return $numOfweeks;
}
0
1

I create this function, from brazil :) I hope it is useful

function weekofmonth($time) {

    $firstday       = 1;
    $lastday        = date('j',$time);
    $lastdayweek = 6; //Saturday

    $week = 1;
    for ($day=1;$day<=$lastday;$day++) {
        $timetmp = mktime(0, 0, 0, date('n',$time), $day, date('Y',$time));
        if (date('N',$timetmp) == $lastdayweek) {
            $week++;
        }
    }
    if (date('N',$time)==$lastdayweek) {
        $week--;
    }

    return $week;
}

$time = mktime(0, 0, 0, 9, 30, 2014);
echo weekofmonth($time);
1

I found a easy way to determine what week of the month today is in, and it would be a small change to have it work on any other date. I'm adding my two cents in here as I think my way is much more compact then the methods listed.

$monthstart = date("N",strtotime(date("n/1/Y")));
$date =( date("j")+$monthstart ) /7;
$ddate= floor( $date );
if($ddate != date) {$ddate++;}

and $ddate contains the week number you could modify it like so

function findweek($indate)
{
  $monthstart = date("N",strtotime(date("n/1/Y",strtotime($indate))));
  $date =( date("j",strtotime($indate))+$monthstart ) /7;
  $ddate= floor( $date );
  if($ddate != $date) {$ddate++;}
  return $ddate;
}

and it would return what week of the month any date you give it is. what it does is first find the number of days from the start of the week to the first of the month. then adds that on to the current date then divides the new date by 7 and that will give you how many weeks have passed since the start of the month, including a decimal place for the part of the the current week that has passed. so what I do next is round down that number, then compare the rounded down version to the original if the two match your at the end of the week so it's already in the number. if they don't then just add one to the rounded down number and voila you have the current week number.

1
  • Interesting. I'll have to play with your code. Very clean, curious to see the results.
    – brenjt
    Commented Feb 15, 2012 at 1:18
1

Srahul07's solution works perfectly... If you abide by the Monday-Sunday week system! Here in 'murica, non-business folk tend to go by Sunday-Saturday being a week, so May 1, 2011 is week 1 and May 2, 2011 is still week 1.

Adding the following logic to the bottom of his function, right before it returns $week will convert this to a Sunday -> Monday system:

if (!date('w',strtotime("$year-$month-01")) && date('w',$timestamp))
    $week--;
elseif (date('w',strtotime("$year-$month-01")) && !date('w',$timestamp))
    $week++;
0

After alot of efoort i found the solution

<?php

function getWeeks($month,$year)
{
    $month = intval($month);        //force month to single integer if '0x'
    $suff = array('st','nd','rd','th','th','th');       //week suffixes
    $end = date('t',mktime(0,0,0,$month,1,$year));      //last date day of month: 28 - 31
    $start = date('w',mktime(0,0,0,$month,1,$year));    //1st day of month: 0 - 6 (Sun - Sat)
    $last = 7 - $start;                     //get last day date (Sat) of first week
    $noweeks = ceil((($end - ($last + 1))/7) + 1);      //total no. weeks in month
    $output = "";                       //initialize string     
    $monthlabel = str_pad($month, 2, '0', STR_PAD_LEFT);
    for($x=1;$x<$noweeks+1;$x++)
    {   
        if($x == 1)
        {
            $startdate = "$year-$monthlabel-01";
            $day = $last - 6;
        }
        else
        {
            $day = $last + 1 + (($x-2)*7);
            $day = str_pad($day, 2, '0', STR_PAD_LEFT);
            $startdate = "$year-$monthlabel-$day";
        }
        if($x == $noweeks)
        {
            $enddate = "$year-$monthlabel-$end";
        }
        else
        {
            $dayend = $day + 6;
            $dayend = str_pad($dayend, 2, '0', STR_PAD_LEFT);
            $enddate = "$year-$monthlabel-$dayend";
        }
        $j=1;
        if($j--)
        {
            $k=getTotalDate($startdate,$enddate);
            $j=1;
        }

    $output .= "Week ".$xyz." week -> Start date=$startdate End date=$enddate <br />";  
    }
    return $output;
}

if(isset($_POST) && !empty($_POST)){
    $month = $_POST['m'];
    $year = $_POST['y']; 
    echo getWeeks($month,$year);
}
?>

<form method="post">
  M:
  <input name="m" value="" />
  Y:
  <input name="y" value="" />
  <input type="submit" value="go" />
</form>
1
  • Fatal error: Call to undefined function getTotalDate() Commented Jun 28, 2015 at 19:15
0

I really liked @michaelc's answer. However, I got stuck on a few points. It seemed that every time Sunday rolled around, there was an offset of one. I think it has to do with what day of the week is the start of the week. In any case, here is my slight alteration to it, expanded a bit for readability:

function wom(\DateTime $date) {
    // The week of the year of the current month
    $cw = date('W', $date->getTimestamp());

    // The week of the year of the first of the given month
    $fw = date('W',strtotime(date('Y-m-01',$date->getTimeStamp())));

    // Offset
    $o = 1;

    // If it is a Saturday, offset by two.
    if( date('N',$date->getTimestamp()) == 7 ) {
        $o = 2;
    }

    return $cw -$fw + $o;
}

So if the date is Nov. 9, 2013...

$cw = 45
$fw = 44

and with the offset of 1, it correctly returns 2.

If the date is Nov. 10, 2013, $cw and $fw are the same as before, but the offset is 2, and it correctly returns 3.

2
  • The poster asked for the week of the month, not the week of the year. Commented Oct 9, 2015 at 20:31
  • Updated with a variant weekOfMonth which starts on Sunday instead. Note that if you just want the week of the year with a Sunday base, (int) strftime("%U", $time) works just as well as anything more complex.
    – Iiridayn
    Commented Jan 12, 2017 at 6:43
0
function get_week_of_month( $timestamp )
{
    $week_of_month = 0; 
    $month = date( 'j', $timestamp );
    $test_month = $month;
    while( $test_month == $month )
    {
        $week_of_month++;
        $timestamp = strtotime( '-1 week', $timestamp );
        $test_month = date( 'j', $timestamp );
    }
    return $week_of_month;
}
1
  • my bad, should have used the "date()" function rather than "format()", see the updated code
    – Algis
    Commented Jan 15, 2014 at 21:01
0

I found this online: http://kcwebprogrammers.blogspot.de/2009/03/current-week-in-month-php.html

He has a very simple solution which seems to work fine for me.

$currentWeek = ceiling((date("d") - date("w") - 1) / 7) + 1;

So for example:

$now = strtotime("today");
$weekOfMonth = ceil((date("d", $now) - date("w", $now) - 1) / 7) + 1;
0

you can use W in newer php versions. http://php.net/manual/en/function.date.php

i have used it like so:

function getWeek($date) { 
$month_start=strtotime("1 ".date('F Y',$date));
$current_date=strtotime(date('j F Y',$date));

$month_week=date("W",$month_start);
$current_week=date("W",$current_date);
return ($current_week-$month_week);

}//0 is the week of the first.
4
  • This doesn't answer the question which was asked. This gets the week of the year, but the poster asked for the week of the month. Commented Oct 9, 2015 at 20:24
  • Yes the function was. I then use it to minus how many weeks the first of this month is from how many weeks till today. Look at the code example from my answer for how to use the function i suggested. Commented Oct 9, 2015 at 21:55
  • Ah, indeed, but alas your function produces a 1 on 2016-02-08 when it should produce a 2. Commented Oct 9, 2015 at 23:02
  • In the comment on the code i said it counts up from 0 so just add 1 to the result. Commented Oct 9, 2015 at 23:35
0

Short and foolproof:

// Function accepts $date as a string,
// Returns the week number in which the given date falls.
// Assumed week starts on Sunday.
function wom($date) {
  $date = strtotime($date);
  $weeknoofday = date('w', $date);
  $day = date('j', $date);
  $weekofmonth = ceil(($day + (7-($weeknoofday+1))) / 7);
  return $weekofmonth;
}
// Test
foreach (range(1, 31) as $day) {
    $test_date = "2015-01-" . str_pad($day, 2, '0', STR_PAD_LEFT);
    echo "$test_date - ";
    echo wom($test_date) . "\n";
}
0
0

I use this simple function:

function weekNumberInMonth($timestampDate)
{
    $firstDayOfMonth = strtotime(date('01-M-Y 00:00:00', $timestampDate));
    $firstWeekdayOfMonth = date( 'w', $firstDayOfMonth);
    $dayNumberInMonth = date('d', $timestampDate);
    $weekNumberInMonth = ceil(($dayNumberInMonth + $firstWeekdayOfMonth) / 7);
    return $weekNumberInMonth;
}
0
0

if I understand correct, the question is how to identify what number of week within a month of a specific day... I was looking for similar solution. I used some ideas of above answers to develop my own solution. Hope it can be helpful for somebody. If Yes, then UpVote my answer.

function week_number_within_month($datenew){

        $year =  date("Y",strtotime($datenew));  
        $month = date("m",strtotime($datenew));

    // find number of days in this month
    $daysInMonths =  date('t',strtotime($year.'-'.$month.'-01'));
    $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);
    $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));
    $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));
    if($monthEndingDay<$monthStartDay){
        $numOfweeks++;
    }
    $date=date('Y/m/d', strtotime($year.'-'. $month.'-01'));
    $week_array=Array();
    for ($i=1; $i<=$numOfweeks; $i++){   /// create an Array of all days of month separated by weeks as a keys
            $max = 7;
            if ($i ==1){ $max = 8 - $monthStartDay;}
            if ($i == $numOfweeks){ $max = $monthEndingDay;}
            for ($r=1; $r<=$max; $r++){

                    $week_array[$i][]=$date;
                    $date = date('Y/m/d',strtotime($date . "+1 days"));
            }
    }
    $new_datenew = date('Y/m/d', strtotime($datenew));
    $week_result='';
        foreach ($week_array as $key => $val){  /// finding what week number of my date from week_array
            foreach ($val as $kr => $value){
            if ($new_datenew == $value){
                $week_result = $key;
            } 
            }
        }
    return $week_result;
}
print week_number_within_month('2016-09-15');
0
function getWeekOfMonth(\DateTime $date)
{
    $firstWeekdayOfMonth = new DateTime("first weekday 0 {$date->format('M')} {$date->format('Y')}");
    $offset = $firstWeekdayOfMonth->format('N')-1;
    return intval(($date->format('j') + $offset)/7)+1;
}
0
/**
         * In case of Week we can get the week of year. So whenever we will get the week of the month then we have to
         * subtract the until last month weeks from it will give us the current month week.
         */
        $dateComponents = getdate();

        if($dateComponents['mon'] == 1)
            $weekOfMonth = date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-'.$dateComponents['mday']))-1; // We subtract -1 to map it to the array
        else
            $weekOfMonth = date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-'.$dateComponents['mday']))-date('W', strtotime($dateComponents['year'].'-'.$dateComponents['mon'].'-01'));
0

Using Carbon:

$date = Carbon::now(); $d1 = $date->startOfMonth(); $d2 = $date->endOfMonth();

$weeks = $d1->diffInWeeks($d2);

0

If you clearly want to separate a month into 4 Weeks, you can use this function. This is helpful, if you want

  • "the first monday of month"
  • "the third thursday of month" etc.

Here we go

/**
* This Calculates (and returns) the week number within a month, based on date('j') day of month.
* This is useful, if you want to have (for instance) the first Thu in month, regardless of date
* @param $Timestamp
* @return float|int
*/
function getWeekOfMonth($Timestamp)
{
    $DayOfMonth=date('j', $Timestamp); // Day of the month without leading zeros 0-31

    if($DayOfMonth>21) return 4;
    if($DayOfMonth>14) return 3;
    if($DayOfMonth>7) return 2;
    return 1;
}
0

From carbon:

return (int) ceil((new Datetime())->format('d') / 7);

As simple as possible :)

-1

Python: Number of the Week in a Month

This is a worked example in Python - should be simple to convert.

Not the answer you're looking for? Browse other questions tagged or ask your own question.